from sqlalchemy.orm import Session
from fastapi import HTTPException, status
from typing import List, Optional

from app.common import models, schemas

def get_departments(db: Session, skip: int = 0, limit: int = 100) -> List[models.Department]:
    return db.query(models.Department).offset(skip).limit(limit).all()

def get_department(db: Session, department_id: int) -> models.Department:
    department = db.query(models.Department).filter(models.Department.id == department_id).first()
    if not department:
        raise HTTPException(status_code=404, detail="Department not found")
    return department

def get_department_by_name(db: Session, name: str) -> Optional[models.Department]:
    return db.query(models.Department).filter(models.Department.department_name == name).first()

def create_department(db: Session, department: schemas.DepartmentCreate) -> models.Department:
    # Check if department with same name already exists
    db_department = get_department_by_name(db, department.department_name)
    if db_department:
        raise HTTPException(status_code=400, detail="Department with this name already exists")
    
    # Create new department
    db_department = models.Department(
        department_name=department.department_name,
        description=department.description
    )
    db.add(db_department)
    db.commit()
    db.refresh(db_department)
    return db_department

def update_department(db: Session, department_id: int, department: schemas.DepartmentCreate) -> models.Department:
    db_department = get_department(db, department_id)
    
    # Check if another department with the new name already exists
    if department.department_name != db_department.department_name:
        existing = get_department_by_name(db, department.department_name)
        if existing:
            raise HTTPException(status_code=400, detail="Department with this name already exists")
    
    # Update department
    db_department.department_name = department.department_name
    db_department.description = department.description
    
    db.commit()
    db.refresh(db_department)
    return db_department

def delete_department(db: Session, department_id: int) -> dict:
    db_department = get_department(db, department_id)
    
    # Check if department has advisors
    if db_department.advisors:
        raise HTTPException(
            status_code=400, 
            detail="Cannot delete department with assigned advisors. Reassign advisors first."
        )
    
    db.delete(db_department)
    db.commit()
    return {"message": "Department deleted successfully"} 