from fastapi import APIRouter, Depends, Request
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
import jwt

from database import get_db
from models import SystemSetting, User, Company
from auth import SECRET_KEY, ALGORITHM

router = APIRouter(prefix="/api/v1/settings", tags=["settings"])

@router.get("/public")
async def get_public_settings(request: Request, db: AsyncSession = Depends(get_db)):
    """
    Endpoint público para obtener el nombre de la app y el logo sin autenticación.
    Soporta opcionalmente autenticación vía token en el header para filtrar por empresa.
    """
    company_id = None
    auth_header = request.headers.get("Authorization")
    if auth_header and auth_header.startswith("Bearer "):
        token = auth_header.split(" ")[1]
        try:
            payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
            username = payload.get("sub")
            if username:
                stmt_u = select(User).where(User.username == username)
                res_u = await db.execute(stmt_u)
                user = res_u.scalar_one_or_none()
                if user:
                    company_id = user.company_id
        except Exception:
            pass

    # Si no hay token o no pertenece a una empresa, usar la primera de la base de datos como default
    if not company_id:
        stmt_c = select(Company.id).order_by(Company.id)
        res_c = await db.execute(stmt_c)
        company_id = res_c.scalars().first()

    stmt = select(SystemSetting).where(SystemSetting.key.in_([
        "app_name", "app_logo", "helpdesk_enabled",
        "ticket_stages", "ticket_priorities", "ticket_clients", 
        "ticket_categories", "ticket_tags"
    ]))
    if company_id:
        stmt = stmt.where(SystemSetting.company_id == company_id)
        
    result = await db.execute(stmt)
    settings = result.scalars().all()
    
    # Defaults
    data = {
        "app_name": "GanttScrum Pro",
        "app_logo": None,
        "helpdesk_enabled": "false",
        "ticket_stages": '["Abierto", "En Progreso", "Cerrado", "Resuelto"]',
        "ticket_priorities": '["Baja", "Media", "Alta", "Crítica"]',
        "ticket_clients": '[]',
        "ticket_categories": '[]',
        "ticket_tags": '[]'
    }
    
    for s in settings:
        if s.value:
            data[s.key] = s.value
            
    return data
