from fastapi import APIRouter, Request, Form, Depends
from fastapi.responses import RedirectResponse, JSONResponse
from fastapi.templating import Jinja2Templates
from psycopg2.extras import DictCursor
from typing import List, Tuple
from bootstrap import register_session_logic, decrypt_data, to_sao_paulo_time
from utils import (
    get_db_connection,
)

""" 
TODO: 
- Ajustar e separar em models e controllers 
"""

router = APIRouter(
    prefix="/panel",
    tags=["API Web Panel"]
)
templates = Jinja2Templates(directory="templates")
templates.env.filters['to_sao_paulo_time'] = to_sao_paulo_time

def flash(request: Request, message: str, category: str = "success"):
    if "_messages" not in request.session:
        request.session["_messages"] = []
    request.session["_messages"].append((category, message))

def get_flashed_messages(request: Request) -> List[Tuple[str, str]]:
    return request.session.pop("_messages") if "_messages" in request.session else []

templates.env.globals['get_flashed_messages'] = get_flashed_messages














@router.get("")
async def get_panel_dashboard(request: Request):
    conn = get_db_connection()
    try:
        with conn.cursor(cursor_factory=DictCursor) as cur:
            cur.execute("SELECT * FROM companies ORDER BY created_at DESC;")
            sessions = cur.fetchall()
    finally:
        conn.close()
    return templates.TemplateResponse("dashboard.html", {"request": request, "sessions": sessions})


















@router.post("/register")
async def handle_panel_register(request: Request, cookie_string: str = Form(...)):
    try:
        register_session_logic(cookie_string)
        flash(request, "Sessão registrada/atualizada com sucesso!", "success")
    except Exception as e:
        detail = e.detail if hasattr(e, 'detail') else str(e)
        flash(request, f"Erro ao registrar: {detail}", "danger")
    return RedirectResponse(url="/panel", status_code=303)

@router.post("/delete/{cnpj}")
async def handle_panel_delete(request: Request, cnpj: str):
    conn = get_db_connection()
    try:
        with conn.cursor() as cur:
            cur.execute("DELETE FROM companies WHERE cnpj = %s;", (cnpj,))
            conn.commit()
            if cur.rowcount > 0:
                flash(request, f"Sessão do CNPJ {cnpj} removida com sucesso.", "success")
            else:
                flash(request, f"Nenhuma sessão encontrada para o CNPJ {cnpj}.", "warning")
    except Exception as e:
        flash(request, f"Erro ao remover sessão: {e}", "danger")
    finally:
        conn.close()
    return RedirectResponse(url="/panel", status_code=303)

@router.get("/get-decrypted-cookie/{cnpj}")
async def get_decrypted_cookie(request: Request, cnpj: str):
    """
    Endpoint interno para o painel. Busca um cookie pelo CNPJ,
    descriptografa-o e retorna como JSON.
    """
    conn = get_db_connection()
    try:
        with conn.cursor(cursor_factory=DictCursor) as cur:
            cur.execute("SELECT cookie FROM companies WHERE cnpj = %s;", (cnpj,))
            session_data = cur.fetchone()
        
        if not session_data:
            return JSONResponse(content={"error": "CNPJ não encontrado"}, status_code=404)

        decrypted_cookie = decrypt_data(session_data['cookie'])
        return JSONResponse(content={"decrypted_cookie": decrypted_cookie})

    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)
    finally:
        if conn:
            conn.close()