"""/api/vendors — the PlusROI Vendors write form (phase-3 slice 1). Thin
HTTP layer over ``services/vendors.py`` (owner gate, sheet-owned
write-block, tenant scope, name dedup, audit all live in the service)."""

from __future__ import annotations

from fastapi import APIRouter
from pydantic import BaseModel

from app.routers.deps import ActorDep, ApiError, SessionDep
from app.services import vendors as vendors_svc
from app.services.errors import ServiceError

router = APIRouter()


def _run(fn, *args, **kwargs):
    try:
        return fn(*args, **kwargs)
    except ServiceError as exc:
        raise ApiError(exc.status, exc.code, exc.summary, exc.detail) from exc


class VendorCreate(BaseModel):
    name: str = ""
    kind: str = "org"  # 'org' | 'person'
    email: str | None = None
    phone: str | None = None
    address: str | None = None
    # per-tenant vendor defaults (tenant_vendors marker; alembic 0008)
    default_category: str | None = None
    default_paid_by_party_id: str | None = None


@router.get("/api/vendors")
def list_vendors(session: SessionDep, actor: ActorDep) -> dict:
    return _run(vendors_svc.list_vendors, session, actor)


@router.post("/api/vendors")
def create_vendor(session: SessionDep, actor: ActorDep, body: VendorCreate) -> dict:
    return _run(vendors_svc.create_vendor, session, actor, body.model_dump())
