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

from fastapi import APIRouter, Depends, HTTPException, Path
from sqlalchemy.orm import Session

from app.models.database import get_db
from app.models.user import User
from app.models.role_permission import Role, Permission, role_permissions
from app.schemas import CreateRoleRequest, UpdateRoleRequest
from app.api.routes.auth import get_current_user
from app.services.timezone import iso

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

# --- Roles ---

@router.get("/roles", summary="Listar roles", description="Devuelve los roles según el permiso del usuario autenticado. Si el rol del usuario tiene all_permissions=true, lista todos; si no, solo los roles sin all_permissions.")
async def list_roles(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
    current_role = db.query(Role).filter(Role.name == current_user.role).first()
    q = db.query(Role)
    if current_role and not current_role.all_permissions:
        q = q.filter(Role.all_permissions == False)
    roles = q.order_by(Role.name).all()
    result = []
    for r in roles:
        perms = [{"id": p.id, "code": p.code, "name": p.name} for p in r.permissions]
        users = db.query(User).filter(User.role == r.name).count()
        result.append({
            "id": r.id, "name": r.name, "all_permissions": r.all_permissions,
            "description": r.description, "permissions": perms, "users_count": users,
            "created_at": iso(r.created_at),
        })
    return result


@router.post("/roles", status_code=201, summary="Crear rol", description="Crea un nuevo rol con nombre, descripción, flag all_permissions y lista de permission_ids opcional.")
async def create_role(body: CreateRoleRequest, db: Session = Depends(get_db)):
    if not body.name:
        raise HTTPException(status_code=400, detail="Nombre requerido")
    existing = db.query(Role).filter(Role.name == body.name).first()
    if existing:
        raise HTTPException(status_code=409, detail="El rol ya existe")
    r = Role(name=body.name, all_permissions=body.all_permissions,
             description=body.description or "")
    db.add(r)
    db.commit()
    if body.permission_ids:
        perms = db.query(Permission).filter(Permission.id.in_(body.permission_ids)).all()
        r.permissions = perms
        db.commit()
    return {"ok": True, "id": r.id}


@router.put("/roles/{role_id}", summary="Actualizar rol", description="Modifica nombre, all_permissions, descripción o lista de permisos de un rol existente.")
async def update_role(role_id: int = Path(..., description="ID del rol"), body: UpdateRoleRequest = None, db: Session = Depends(get_db)):
    r = db.query(Role).filter(Role.id == role_id).first()
    if not r:
        raise HTTPException(status_code=404, detail="Rol no encontrado")
    if body.name:
        r.name = body.name
    if body.all_permissions is not None:
        r.all_permissions = body.all_permissions
    if body.description is not None:
        r.description = body.description
    if body.permission_ids is not None:
        perms = db.query(Permission).filter(Permission.id.in_(body.permission_ids)).all()
        r.permissions = perms
    db.commit()
    return {"ok": True}


@router.delete("/roles/{role_id}", summary="Eliminar rol", description="Elimina permanentemente un rol. Los usuarios que tenían este rol quedan sin rol asociado.")
async def delete_role(role_id: int = Path(..., description="ID del rol a eliminar"), db: Session = Depends(get_db)):
    r = db.query(Role).filter(Role.id == role_id).first()
    if not r:
        raise HTTPException(status_code=404, detail="Rol no encontrado")
    db.delete(r)
    db.commit()
    return {"ok": True}


# --- Permissions ---

@router.get("/permissions", summary="Listar permisos", description="Devuelve los 32 permisos predefinidos del sistema, agrupados por módulo.")
async def list_permissions(db: Session = Depends(get_db)):
    perms = db.query(Permission).order_by(Permission.module, Permission.name).all()
    return [{"id": p.id, "code": p.code, "name": p.name, "module": p.module} for p in perms]


@router.post("/permissions/seed", status_code=201, summary="Sembrar permisos", description="Inserta los 32 permisos predefinidos del sistema si no existen. Idempotente: no duplica permisos ya existentes. Elimina automaticamente los permisos antiguos reportes.foliado-sitio y reportes.graficos-dependencia.")
async def seed_permissions(db: Session = Depends(get_db)):
    data = [
        ("dashboard.view", "Ver Dashboard", "Dashboard"),
        ("conexiones.view", "Ver Conexiones", "Conexiones API"),
        ("conexiones.create", "Crear Conexion", "Conexiones API"),
        ("conexiones.edit", "Editar Conexion", "Conexiones API"),
        ("conexiones.delete", "Eliminar Conexion", "Conexiones API"),
        ("conexiones.sync", "Sincronizar Sitios", "Conexiones API"),
        ("sitios.view", "Ver Sitios", "Sitios"),
        ("sitios.create", "Crear Sitio", "Sitios"),
        ("sitios.edit", "Editar Sitio", "Sitios"),
        ("sitios.delete", "Eliminar Sitio", "Sitios"),
        ("sitios.sync", "Sincronizar Sitio", "Sitios"),
        ("carpetas.view", "Ver Cuadro de Clasificación", "Series, Subseries y Expedientes"),
        ("carpetas.sync", "Sincronizar Series, Subseries y Expedientes", "Series, Subseries y Expedientes"),
        ("index.view", "Ver Indice Electronico", "Indice Electronico"),
        ("index.generate", "Generar Indice", "Indice Electronico"),
        ("usuarios.view", "Ver Usuarios", "Usuarios"),
        ("usuarios.create", "Crear Usuario", "Usuarios"),
        ("usuarios.edit", "Editar Usuario", "Usuarios"),
        ("usuarios.delete", "Eliminar Usuario", "Usuarios"),
        ("roles.view", "Ver Roles", "Roles"),
        ("roles.create", "Crear Rol", "Roles"),
        ("roles.edit", "Editar Rol", "Roles"),
        ("roles.delete", "Eliminar Rol", "Roles"),
        ("jobs.view", "Ver Trabajos", "Trabajos en Cola"),
        ("jobs.cancel", "Cancelar Trabajos", "Trabajos en Cola"),
        ("jobs.purge", "Limpiar Cola", "Trabajos en Cola"),
        ("listener-logs.view", "Ver Logs API", "Logs API"),
        ("reportes.generate", "Generar Reportes", "Reportes"),
        ("reportes.create", "Crear Reporte Externo", "Reportes"),
        ("reportes.edit", "Editar Reporte Externo", "Reportes"),
        ("reportes.delete", "Eliminar Reporte Externo", "Reportes"),
        ("reportes.toggle", "Activar/Inactivar Reportes", "Reportes"),
    ]
    stale = ["reportes.foliado-sitio", "reportes.graficos-dependencia"]
    removed = 0
    for code in stale:
        p = db.query(Permission).filter(Permission.code == code).first()
        if p:
            db.delete(p)
            removed += 1
    created = 0
    for code, name, module in data:
        existing = db.query(Permission).filter(Permission.code == code).first()
        if not existing:
            db.add(Permission(code=code, name=name, module=module))
            created += 1
    db.commit()
    return {"ok": True, "created": created, "removed": removed, "total": len(data)}
