"""
Rutas para gestión de relaciones usuario-tenant
"""

from typing import List

from core.database import get_core_db
from core.security import get_current_user
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from .dto import (
    AddUserToTenantRequestDTO,
    RemoveUserFromTenantRequestDTO,
    TenantBasicInfoDTO,
    UpdateUserRoleRequestDTO,
    UserTenantResponseDTO,
    UserTenantsResponseDTO,
)
from .service import UserTenantService

router = APIRouter(prefix="/user-tenants")


@router.post("/add", response_model=UserTenantResponseDTO)
def add_user_to_tenant(
    data: AddUserToTenantRequestDTO,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Agrega un usuario a un tenant

    Requiere permisos de administrador
    """
    service = UserTenantService(db)
    result = service.add_user_to_tenant(
        keycloak_user_id=data.keycloak_user_id, tenant_id=data.tenant_id, role=data.role
    )
    return result


@router.post("/remove")
def remove_user_from_tenant(
    data: RemoveUserFromTenantRequestDTO,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Elimina un usuario de un tenant

    Requiere permisos de administrador
    """
    service = UserTenantService(db)
    service.remove_user_from_tenant(
        keycloak_user_id=data.keycloak_user_id,
        tenant_id=data.tenant_id,
        soft_delete=data.soft_delete,
    )
    return {"message": "User removed from tenant successfully"}


@router.put("/update-role", response_model=UserTenantResponseDTO)
def update_user_role(
    data: UpdateUserRoleRequestDTO,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Actualiza el rol de un usuario en un tenant

    Requiere permisos de administrador
    """
    service = UserTenantService(db)
    result = service.update_user_role_in_tenant(
        keycloak_user_id=data.keycloak_user_id, tenant_id=data.tenant_id, role=data.role
    )
    return result


@router.get("/user/{keycloak_user_id}", response_model=UserTenantsResponseDTO)
def get_user_tenants(
    keycloak_user_id: str,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Obtiene todos los tenants a los que tiene acceso un usuario

    Los usuarios solo pueden ver sus propios tenants, a menos que sean admin
    """
    # Verificar que el usuario solo pueda ver sus propios tenants (excepto admin)
    if current_user.get("sub") != keycloak_user_id:
        # TODO: Verificar si es admin
        raise HTTPException(
            status_code=403, detail="You can only view your own tenants"
        )

    service = UserTenantService(db)
    tenants = service.get_user_tenants(keycloak_user_id)

    return UserTenantsResponseDTO(
        keycloak_user_id=keycloak_user_id,
        tenants=[TenantBasicInfoDTO.model_validate(t) for t in tenants],
    )


@router.get("/tenant/{tenant_id}", response_model=List[UserTenantResponseDTO])
def get_tenant_users(
    tenant_id: int,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Obtiene todos los usuarios que tienen acceso a un tenant

    Requiere permisos de administrador del tenant
    """
    service = UserTenantService(db)
    user_tenants = service.get_tenant_users(tenant_id)
    return user_tenants


@router.get("/check-access/{keycloak_user_id}/{tenant_id}")
def check_user_access(
    keycloak_user_id: str,
    tenant_id: int,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
):
    """
    Verifica si un usuario tiene acceso a un tenant
    """
    service = UserTenantService(db)
    has_access = service.user_has_access_to_tenant(keycloak_user_id, tenant_id)

    return {
        "keycloak_user_id": keycloak_user_id,
        "tenant_id": tenant_id,
        "has_access": has_access,
    }
