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

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


class SupplierCreate(BaseModel):
    name: str
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    gst_number: Optional[str] = None
    balance: float = 0.0
    is_active: bool = True

class SupplierUpdate(BaseModel):
    name: Optional[str] = None
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    gst_number: Optional[str] = None
    balance: Optional[float] = None
    is_active: Optional[bool] = None

class SupplierOut(BaseModel):
    id: str
    code: str
    name: str
    contact_person: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    gst_number: Optional[str] = None
    balance: float
    is_active: bool
    created_at: datetime
    updated_at: datetime
    model_config = {"from_attributes": True}


def _generate_supplier_code(db: Session) -> str:
    last = db.query(Supplier).filter(
        Supplier.code.like("SUP-%")
    ).order_by(Supplier.code.desc()).first()
    if last:
        seq = int(last.code.split("-")[-1]) + 1
    else:
        seq = 1
    return f"SUP-{seq:06d}"


@router.get("", response_model=list[SupplierOut])
def list_suppliers(
    search: Optional[str] = None,
    is_active: Optional[bool] = None,
    db: Session = Depends(get_db),
    _=Depends(get_current_user),
):
    q = db.query(Supplier)
    if search:
        q = q.filter(Supplier.name.ilike(f"%{search}%"))
    if is_active is not None:
        q = q.filter(Supplier.is_active == is_active)
    return q.order_by(Supplier.name).all()


@router.post("", response_model=SupplierOut, status_code=201)
def create_supplier(data: SupplierCreate, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = Supplier(**data.model_dump(), code=_generate_supplier_code(db))
    db.add(obj)
    db.commit()
    db.refresh(obj)
    return obj


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


@router.put("/{supplier_id}", response_model=SupplierOut)
def update_supplier(supplier_id: str, data: SupplierUpdate, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = db.query(Supplier).filter(Supplier.id == supplier_id).first()
    if not obj:
        raise HTTPException(status_code=404, detail="Supplier 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("/{supplier_id}")
def delete_supplier(supplier_id: str, db: Session = Depends(get_db), _=Depends(get_current_user)):
    obj = db.query(Supplier).filter(Supplier.id == supplier_id).first()
    if not obj:
        raise HTTPException(status_code=404, detail="Supplier not found")
    db.delete(obj)
    db.commit()
    return {"detail": "Supplier deleted"}
