# import time
# import os
# from datetime import datetime

# log_file = "/var/log/apache2/magic8ball_backtestingmarket_access.log"


# def count_requests_per_minute():
#     while True:
#         if os.path.exists(log_file):
#             current_minute = datetime.now().strftime("%d/%b/%Y:%H:%M")
#             with open(log_file, 'r') as f:
#                 logs = f.readlines()
#             requests_this_minute = [line for line in logs if current_minute in line]
#             print(f"Requests in the last minute: {len(requests_this_minute)}")
#         else:
#             print(f"Log file {log_file} does not exist. Please check the path.")
#         time.sleep(60)

# if __name__ == "__main__":
#     count_requests_per_minute()

# import time
# import os
# from datetime import datetime

# # log_file = "/var/log/apache2/magic8ball_backtestingmarket_access.log"
# log_file = "/var/log/apache2/magic8ball_backtestingmarket_access.log"

# def count_unique_ips_per_minute():
#     last_position = 0
#     while True:
#         try:
#             if os.path.exists(log_file):
#                 current_minute = datetime.now().strftime("%d/%b/%Y:%H:%M")
#                 current_time = datetime.now().strftime("%H:%M:%S")
#                 with open(log_file, 'r') as f:
#                     # Mover al final del archivo si es la primera vez
#                     f.seek(last_position)
#                     logs = f.readlines()
#                     last_position = f.tell()  # Guardar la última posición leída

#                 # Utilizar un conjunto para almacenar las IPs únicas
#                 unique_ips = set()
#                 for line in logs:
#                     if current_minute in line:
#                         # Extraer la IP como el primer elemento de la línea
#                         ip = line.split()[0]
#                         unique_ips.add(ip)

#                 # Mostrar la hora, cantidad de IPs únicas y las IPs mismas
#                 print(f"[{current_time}] Unique IPs in the last minute: {len(unique_ips)}")
#                 print(f"IPs: {', '.join(unique_ips)}")
#                 print("*************************************************************************************************")
#             else:
#                 print(f"Log file {log_file} does not exist. Please check the path.")
#         except Exception as e:
#             print(f"An error occurred: {e}")

#         time.sleep(60)

# if __name__ == "__main__":
#     count_unique_ips_per_minute()


import time
import os
from datetime import datetime, timedelta, timezone
from collections import deque

log_file = "/var/log/apache2/magic8ball_backtestingmarket_access.log"

# Cola para mantener las marcas de tiempo válidas
request_timestamps = deque()
last_position = 0

def parse_log_datetime(line):
    try:
        timestamp_str = line.split('[')[1].split(']')[0]
        return datetime.strptime(timestamp_str, "%d/%b/%Y:%H:%M:%S %z")
    except Exception:
        return None

def count_requests_window():
    global last_position

    print("Tracking real requests in sliding window of 60s...\n")

    while True:
        now = datetime.now(timezone.utc)

        # Eliminar timestamps fuera de la ventana de 60s
        while request_timestamps and (now - request_timestamps[0]) > timedelta(seconds=60):
            request_timestamps.popleft()

        if os.path.exists(log_file):
            with open(log_file, 'r') as f:
                f.seek(last_position)
                new_lines = f.readlines()
                last_position = f.tell()

            for line in new_lines:
                dt = parse_log_datetime(line)
                if dt and (now - dt) <= timedelta(seconds=60):
                    request_timestamps.append(dt)

            print(f"[{now.strftime('%H:%M:%S')}] ✅ Requests in the last 60s: {len(request_timestamps)}")
        else:
            print(f"❌ Log file not found: {log_file}")

        time.sleep(10)

if __name__ == "__main__":
    count_requests_window()
