import os, json, time, logging
from typing import Optional
from utils.sanitize import sanitize_for_ai

# Simple whitelist config (can be replaced by ai_whitelist.json)
WHITELIST_FILE = 'ai_whitelist.json'
DEFAULT_WHITELIST = [
    "http://127.0.0.1:5000",
    "http://internal-ai.local"
]

LOG_FILE = os.path.join('logs', 'ai_payloads.log')

logger = logging.getLogger('ai_integration')
logger.setLevel(logging.INFO)
fh = logging.FileHandler(LOG_FILE)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)


def load_whitelist() -> list:
    if os.path.exists(WHITELIST_FILE):
        try:
            with open(WHITELIST_FILE, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception:
            pass
    return DEFAULT_WHITELIST


WHITELIST = load_whitelist()


def log_raw_payload(endpoint: str, payload: str) -> None:
    logger.info('RAW_PAYLOAD endpoint=%s payload_length=%d', endpoint, len(payload))
    # store the raw payload for debugging (append with timestamp)
    ts = int(time.time())
    raw_path = os.path.join('logs', f'payload_{ts}.txt')
    try:
        with open(raw_path, 'w', encoding='utf-8') as f:
            f.write(f'ENDPOINT: {endpoint}\n')
            f.write(payload)
    except Exception as e:
        logger.exception('Failed to write raw payload: %s', e)


def send_to_ai(endpoint: str, html_payload: str, force: bool = False) -> dict:
    """Sanitize HTML, log raw payload, check whitelist and (mock) send to AI.

    Returns a dict with status and sanitized text. This function intentionally
    does not perform real network calls; integrate your real client here.
    """
    log_raw_payload(endpoint, html_payload)
    sanitized = sanitize_for_ai(html_payload)
    logger.info('SANITIZED_PAYLOAD endpoint=%s sanitized_length=%d', endpoint, len(sanitized))

    # Write sanitized payload to a timestamped file for inspection
    try:
        ts = int(time.time())
        sanitized_path = os.path.join('logs', f'sanitized_{ts}.txt')
        with open(sanitized_path, 'w', encoding='utf-8') as sf:
            sf.write(f'ENDPOINT: {endpoint}\n')
            sf.write(sanitized)
        logger.info('WROTE sanitized payload to %s', sanitized_path)
    except Exception:
        logger.exception('Failed to write sanitized payload')

    if (endpoint not in WHITELIST) and not force:
        logger.warning('Endpoint not whitelisted: %s', endpoint)
        return {'status': 'blocked', 'reason': 'endpoint not whitelisted', 'sanitized': sanitized}

    # Mock response
    logger.info('Mock send to AI for endpoint=%s', endpoint)
    return {'status': 'ok', 'sanitized': sanitized}


if __name__ == '__main__':
    # quick local demo
    html = '<div><h1>Machine MHA-aaaaaaaa</h1><p>8GB RAM</p></div>'
    print(send_to_ai('http://127.0.0.1:5000', html))
