import csv
from scoring.redis_state import check_velocity, check_duplicate

def check_ip_blocklist(ip, blocklist_file):
    with open(blocklist_file, "r") as file:
        reader = csv.DictReader(file)

        for row in reader:
            if row["ip"] == str(ip):
                return {
                    "blocklist_hit": True,
                    "reason": row["reason"]
                }

    return {
        "blocklist_hit": False,
        "reason": None
    }

def check_user_agent(user_agent, blocklist_file):
    with open(blocklist_file, "r") as file:
        reader = csv.DictReader(file)

        for row in reader:
            if row["ua_pattern"].lower() in user_agent.lower():
                return {
                    "bad_ua": True,
                    "reason": row["reason"]
                }

    return {
        "bad_ua": False,
        "reason": None
    }

def extract_features(request, ip_blocklist_file, ua_blocklist_file):
    ip_result = check_ip_blocklist(
        request.ip,
        ip_blocklist_file
    )

    ua_result = check_user_agent(
        request.user_agent,
        ua_blocklist_file
    )

    geo_mismatch = (
        request.geo_declared.upper()
        != request.geo_ip.upper()
    )

    velocity_result = check_velocity(
        str(request.ip)
    )

    duplicate_result = check_duplicate(
        str(request.ip),
        request.user_agent
    )

    return {
        "blocklist_hit": ip_result["blocklist_hit"],
        "blocklist_reason": ip_result["reason"],

        "bad_ua": ua_result["bad_ua"],
        "bad_ua_reason": ua_result["reason"],

        "geo_mismatch": geo_mismatch,

        "high_velocity": velocity_result["high_velocity"],
        "request_count": velocity_result["request_count"],

        "duplicate": duplicate_result["duplicate"]
    }