import sys
sys.path.insert(0, "/var/www/html/metafoliadorv2")

import logging
from fastapi import APIRouter, Depends, HTTPException, Query, Path, Request
from pydantic import BaseModel, Field
from sqlalchemy.orm import Session
from typing import Optional

from app.models.database import get_db
from app.models.alfresco_tipology import AlfrescoTipology
from app.services.timezone import now as tznow
from app.services.timezone import iso

logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1/tipologias", tags=["tipologias"])


class CreateTipologiaRequest(BaseModel):
    name: str = Field(..., description="Nombre de la tipología")
    value: Optional[str] = Field(None, description="Valor o descripción de la tipología")


class UpdateTipologiaRequest(BaseModel):
    name: Optional[str] = Field(None, description="Nombre de la tipología")
    value: Optional[str] = Field(None, description="Valor o descripción de la tipología")


def _serialize(t: AlfrescoTipology) -> dict:
    return {
        "id": t.id,
        "name": t.name,
        "value": t.value,
        "created_at": iso(t.created_at),
        "updated_at": iso(t.updated_at),
        "deleted_at": iso(t.deleted_at),
    }


@router.get("", summary="Listar tipologías",
    description="Lista todas las tipologías activas (no eliminadas).")
async def list_tipologias(
    search: Optional[str] = Query(None, description="Buscar por nombre"),
    db: Session = Depends(get_db),
):
    q = db.query(AlfrescoTipology).filter(AlfrescoTipology.deleted_at == None)
    if search:
        q = q.filter(AlfrescoTipology.name.ilike(f"%{search}%"))
    items = q.order_by(AlfrescoTipology.name).all()
    return [_serialize(t) for t in items]


@router.get("/{tipologia_id}", summary="Obtener tipología",
    description="Obtiene una tipología por ID.")
async def get_tipologia(
    tipologia_id: int = Path(..., description="ID de la tipología"),
    db: Session = Depends(get_db),
):
    t = db.query(AlfrescoTipology).filter(
        AlfrescoTipology.id == tipologia_id,
        AlfrescoTipology.deleted_at == None,
    ).first()
    if not t:
        raise HTTPException(status_code=404, detail="Tipología no encontrada")
    return _serialize(t)


@router.post("", status_code=201, summary="Crear tipología",
    description="Crea una nueva tipología.")
async def create_tipologia(
    body: CreateTipologiaRequest,
    db: Session = Depends(get_db),
):
    t = AlfrescoTipology(
        name=body.name,
        value=body.value,
    )
    db.add(t)
    db.commit()
    db.refresh(t)
    return _serialize(t)


@router.put("/{tipologia_id}", summary="Actualizar tipología",
    description="Actualiza los datos de una tipología existente.")
async def update_tipologia(
    tipologia_id: int = Path(..., description="ID de la tipología"),
    body: UpdateTipologiaRequest = None,
    db: Session = Depends(get_db),
):
    t = db.query(AlfrescoTipology).filter(
        AlfrescoTipology.id == tipologia_id,
        AlfrescoTipology.deleted_at == None,
    ).first()
    if not t:
        raise HTTPException(status_code=404, detail="Tipología no encontrada")

    if body.name is not None:
        t.name = body.name
    if body.value is not None:
        t.value = body.value
    t.updated_at = tznow()

    db.commit()
    db.refresh(t)
    return _serialize(t)


@router.delete("/{tipologia_id}", summary="Eliminar tipología",
    description="Realiza un soft-delete de la tipología.")
async def delete_tipologia(
    tipologia_id: int = Path(..., description="ID de la tipología"),
    db: Session = Depends(get_db),
):
    t = db.query(AlfrescoTipology).filter(
        AlfrescoTipology.id == tipologia_id,
        AlfrescoTipology.deleted_at == None,
    ).first()
    if not t:
        raise HTTPException(status_code=404, detail="Tipología no encontrada")

    t.deleted_at = tznow()
    db.commit()
    return {"ok": True}
