"""Doctor profile creation (admin sets the doctor's username + password)."""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session

from database import get_db
from model.center import Center
from model.doctor import Doctor
from core.security import hash_password
from schemas import DoctorCreate, DoctorOut

router = APIRouter(prefix="/doctors", tags=["Doctors"])


@router.post("", response_model=DoctorOut, status_code=status.HTTP_201_CREATED)
def create_doctor(payload: DoctorCreate, db: Session = Depends(get_db)):
    if not db.get(Center, payload.center_id):
        raise HTTPException(status.HTTP_404_NOT_FOUND, "Center not found")

    # Uniqueness pre-checks give clean messages instead of a raw 500.
    if db.query(Doctor).filter(Doctor.username == payload.username).first():
        raise HTTPException(status.HTTP_409_CONFLICT, "Username already taken")
    if db.query(Doctor).filter(Doctor.email == payload.email).first():
        raise HTTPException(status.HTTP_409_CONFLICT, "Email already registered")
    if db.query(Doctor).filter(Doctor.mobile_number == payload.mobile_number).first():
        raise HTTPException(status.HTTP_409_CONFLICT, "Mobile number already registered")

    doctor = Doctor(
        full_name=payload.full_name,
        email=payload.email,
        mobile_number=payload.mobile_number,
        gender=payload.gender,
        age=payload.age,
        specialization=payload.specialization,
        address=payload.address,
        username=payload.username,
        password=hash_password(payload.password),
        center_id=payload.center_id,
    )
    db.add(doctor)
    db.commit()
    db.refresh(doctor)
    return doctor


@router.get("", response_model=list[DoctorOut])
def list_doctors(db: Session = Depends(get_db)):
    return db.query(Doctor).order_by(Doctor.full_name).all()


@router.get("/by-center/{center_id}", response_model=list[DoctorOut])
def list_doctors_of_center(center_id: int, db: Session = Depends(get_db)):
    if not db.get(Center, center_id):
        raise HTTPException(status.HTTP_404_NOT_FOUND, "Center not found")
    return (
        db.query(Doctor)
        .filter(Doctor.center_id == center_id)
        .order_by(Doctor.full_name)
        .all()
    )
