from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy.orm import selectinload
from sqlalchemy import delete

from database import get_db
from models import Team, User, AuditLog
from schemas import TeamCreate, TeamResponse, UserResponse
from auth import get_current_active_user, require_roles

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

@router.get("", response_model=list[TeamResponse])
async def get_teams(
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_current_active_user)
):
    stmt = select(Team).where(Team.company_id == current_user.company_id).options(selectinload(Team.members).selectinload(User.roles))
    result = await db.execute(stmt)
    return result.scalars().all()

@router.post("", response_model=TeamResponse)
async def create_team(
    team: TeamCreate,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_roles(["Administrador", "Project Manager"]))
):
    db_team = Team(**team.model_dump())
    db.add(db_team)
    
    # Audit log
    audit = AuditLog(user_id=current_user.id, username=current_user.username, action=f"Creó el equipo '{team.name}'")
    db.add(audit)
    
    await db.commit()
    await db.refresh(db_team)
    
    # Reload with relationships
    stmt = select(Team).where(Team.company_id == current_user.company_id).where(Team.id == db_team.id).options(selectinload(Team.members).selectinload(User.roles))
    result = await db.execute(stmt)
    return result.scalar_one()

@router.put("/{team_id}", response_model=TeamResponse)
async def update_team(
    team_id: int,
    team_update: TeamCreate,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_roles(["Administrador", "Project Manager"]))
):
    stmt = select(Team).where(Team.company_id == current_user.company_id).where(Team.id == team_id).options(selectinload(Team.members).selectinload(User.roles))
    result = await db.execute(stmt)
    db_team = result.scalar_one_or_none()
    
    if not db_team:
        raise HTTPException(status_code=404, detail="Team not found")
        
    db_team.name = team_update.name
    db_team.description = team_update.description
    
    # Audit log
    audit = AuditLog(user_id=current_user.id, username=current_user.username, action=f"Actualizó el equipo '{team_update.name}'")
    db.add(audit)
    
    await db.commit()
    await db.refresh(db_team)
    return db_team

@router.delete("/{team_id}")
async def delete_team(
    team_id: int,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_roles(["Administrador", "Project Manager"]))
):
    stmt = select(Team).where(Team.company_id == current_user.company_id).where(Team.id == team_id)
    result = await db.execute(stmt)
    db_team = result.scalar_one_or_none()
    
    if not db_team:
        raise HTTPException(status_code=404, detail="Team not found")
        
    await db.delete(db_team)
    
    # Audit log
    audit = AuditLog(user_id=current_user.id, username=current_user.username, action=f"Eliminó el equipo '{db_team.name}'")
    db.add(audit)
    
    await db.commit()
    return {"message": "Team deleted successfully"}

@router.post("/{team_id}/members/{user_id}", response_model=TeamResponse)
async def add_team_member(
    team_id: int,
    user_id: int,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_roles(["Administrador", "Project Manager"]))
):
    # Get team
    stmt_team = select(Team).where(Team.company_id == current_user.company_id).where(Team.id == team_id).options(selectinload(Team.members).selectinload(User.roles))
    result_team = await db.execute(stmt_team)
    db_team = result_team.scalar_one_or_none()
    
    if not db_team:
        raise HTTPException(status_code=404, detail="Team not found")
        
    # Get user
    stmt_user = select(User).where(User.company_id == current_user.company_id).where(User.id == user_id)
    result_user = await db.execute(stmt_user)
    db_user = result_user.scalar_one_or_none()
    
    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")
        
    if db_user not in db_team.members:
        db_team.members.append(db_user)
        
        # Audit log
        audit = AuditLog(user_id=current_user.id, username=current_user.username, action=f"Añadió a {db_user.username} al equipo '{db_team.name}'")
        db.add(audit)
        
        await db.commit()
        await db.refresh(db_team)
        
    return db_team

@router.delete("/{team_id}/members/{user_id}", response_model=TeamResponse)
async def remove_team_member(
    team_id: int,
    user_id: int,
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_roles(["Administrador", "Project Manager"]))
):
    stmt_team = select(Team).where(Team.company_id == current_user.company_id).where(Team.id == team_id).options(selectinload(Team.members).selectinload(User.roles))
    result_team = await db.execute(stmt_team)
    db_team = result_team.scalar_one_or_none()
    
    if not db_team:
        raise HTTPException(status_code=404, detail="Team not found")
        
    stmt_user = select(User).where(User.company_id == current_user.company_id).where(User.id == user_id)
    result_user = await db.execute(stmt_user)
    db_user = result_user.scalar_one_or_none()
    
    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")
        
    if db_user in db_team.members:
        db_team.members.remove(db_user)
        
        # Audit log
        audit = AuditLog(user_id=current_user.id, username=current_user.username, action=f"Removió a {db_user.username} del equipo '{db_team.name}'")
        db.add(audit)
        
        await db.commit()
        await db.refresh(db_team)
        
    return db_team
