from fastapi import APIRouter, Depends, HTTPException
from uuid import UUID
from pydantic import BaseModel
from typing import Optional

from app.core.postgres.base_pkg.base_client import BasePostgresClient
from app.modules.partners.application.commands import CreatePartnerCommand, CreatePartnerCommandHandler
from app.modules.partners.application.queries import GetPartnerDetailsQuery, GetPartnerDetailsQueryHandler

router = APIRouter(prefix="/v1/erp/partners", tags=["Partners"])

def get_db_client() -> BasePostgresClient:
    return BasePostgresClient()

class CreatePartnerRequest(BaseModel):
    name: str
    type: str = "SUPPLIER"
    tax_code: Optional[str] = None
    address: Optional[str] = None

@router.post("", status_code=201)
def create_partner(request: CreatePartnerRequest, db_client: BasePostgresClient = Depends(get_db_client)):
    """Tạo mới Đối tác (Nhà cung cấp, Thầu phụ, v.v.)"""
    command = CreatePartnerCommand(
        name=request.name,
        type=request.type,
        tax_code=request.tax_code,
        address=request.address
    )
    handler = CreatePartnerCommandHandler(db_client)
    try:
        partner_id = handler.handle(command)
        return {"partner_id": partner_id, "status": "success"}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.get("/{partner_id}")
def get_partner(partner_id: UUID, db_client: BasePostgresClient = Depends(get_db_client)):
    """Lấy chi tiết đối tác"""
    query = GetPartnerDetailsQuery(partner_id=partner_id)
    handler = GetPartnerDetailsQueryHandler(db_client)
    
    result = handler.handle(query)
    if not result:
        raise HTTPException(status_code=404, detail="Không tìm thấy đối tác.")
        
    return result
