from __future__ import annotations
import uuid
from datetime import datetime
from typing import Optional, List
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from pydantic import BaseModel
from app.database import get_db
from app.models.branch import Branch
from app.services.auth import get_current_user

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


class BranchCreate(BaseModel):
    code: str
    name: str
    address: Optional[str] = None
    city: Optional[str] = None
    phone: Optional[str] = None
    manager_name: Optional[str] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None

class BranchUpdate(BaseModel):
    code: Optional[str] = None
    name: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    phone: Optional[str] = None
    manager_name: Optional[str] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    is_active: Optional[bool] = None

class BranchOut(BaseModel):
    id: str
    code: str
    name: str
    address: Optional[str] = None
    city: Optional[str] = None
    phone: Optional[str] = None
    manager_name: Optional[str] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    is_active: bool
    created_at: datetime
    updated_at: datetime
    model_config = {"from_attributes": True}


@router.get("", response_model=list[BranchOut])
def list_branches(is_active: Optional[bool] = None, db: Session = Depends(get_db), _=Depends(get_current_user)):
    q = db.query(Branch)
    if is_active is not None:
        q = q.filter(Branch.is_active == is_active)
    return q.order_by(Branch.name).all()


@router.post("", response_model=BranchOut, status_code=201)
def create_branch(data: BranchCreate, db: Session = Depends(get_db), _=Depends(get_current_user)):
    existing = db.query(Branch).filter((Branch.code == data.code) | (Branch.name == data.name)).first()
    if existing:
        raise HTTPException(status_code=400, detail="Branch code or name already exists")
    obj = Branch(**data.model_dump())
    db.add(obj)
    db.commit()
    db.refresh(obj)
    return obj


@router.get("/{branch_id}", response_model=BranchOut)
def get_branch(branch_id: str, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = db.query(Branch).filter(Branch.id == branch_id).first()
    if not obj:
        raise HTTPException(status_code=404, detail="Branch not found")
    return obj


@router.put("/{branch_id}", response_model=BranchOut)
def update_branch(branch_id: str, data: BranchUpdate, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = db.query(Branch).filter(Branch.id == branch_id).first()
    if not obj:
        raise HTTPException(status_code=404, detail="Branch not found")
    for k, v in data.model_dump(exclude_unset=True).items():
        setattr(obj, k, v)
    db.commit()
    db.refresh(obj)
    return obj


@router.delete("/{branch_id}")
def delete_branch(branch_id: str, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = db.query(Branch).filter(Branch.id == branch_id).first()
    if not obj:
        raise HTTPException(status_code=404, detail="Branch not found")
    db.delete(obj)
    db.commit()
    return {"detail": "Branch deleted"}
