import sys
import os
import json
from urllib.parse import parse_qs

# Ensure correct path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
os.environ['PYTHONIOENCODING'] = 'utf-8'

# Imports
import db
import server

# Fix encoding issues
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')

# Initialize DB
db.init_db()

# Your frontend origin (DO NOT use *)
ALLOWED_ORIGIN = "https://finisiocleaning.com"

def application(environ, start_response):
    method = environ.get("REQUEST_METHOD", "GET").upper()
    path = environ.get("PATH_INFO", "/").rstrip("/") or "/"
    params = parse_qs(environ.get("QUERY_STRING", ""))

    # --- CORS HEADERS (STRICT + CORRECT) ---
    cors_headers = [
        ("Access-Control-Allow-Origin", ALLOWED_ORIGIN),
        ("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS"),
        ("Access-Control-Allow-Headers", "Content-Type, Authorization"),
        ("Access-Control-Allow-Credentials", "true"),
    ]

    # --- HANDLE PREFLIGHT (THIS WAS YOUR BREAKPOINT) ---
    if method == "OPTIONS":
        headers = cors_headers + [
            ("Content-Type", "application/json"),
            ("Content-Length", "0"),
        ]
        start_response("200 OK", headers)
        return [b""]

    # --- READ BODY ---
    body = {}
    try:
        length = int(environ.get("CONTENT_LENGTH") or 0)
        if length:
            raw_body = environ["wsgi.input"].read(length)
            body = json.loads(raw_body.decode("utf-8"))
    except Exception:
        body = {}

    # --- ROUTING ---
    status_code, payload = 404, {"ok": False, "error": "Not found"}

    for rm, pattern, handler in server.ROUTES:
        if rm != method:
            continue
        match = pattern.match(path)
        if match:
            try:
                status_code, payload = handler(
                    body=body,
                    params=params,
                    **match.groupdict()
                )
            except Exception as e:
                status_code, payload = 500, {"ok": False, "error": str(e)}
            break

    # --- RESPONSE ---
    response_body = json.dumps(payload, default=str).encode("utf-8")

    status_map = {
        200: "200 OK",
        201: "201 Created",
        400: "400 Bad Request",
        403: "403 Forbidden",
        404: "404 Not Found",
        500: "500 Internal Server Error",
    }

    headers = cors_headers + [
        ("Content-Type", "application/json"),
        ("Content-Length", str(len(response_body))),
    ]

    start_response(status_map.get(status_code, "200 OK"), headers)
    return [response_body]