"""
Schemas for Health Test Packages and bundled package items.
"""

from datetime import datetime
from decimal import Decimal
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


class TestPackageBase(BaseModel):
    """Base fields for a test package."""

    name: str = Field(..., min_length=1, max_length=200, description="Package display name")
    code: str | None = Field(None, max_length=50, description="Optional package short code")
    description: str | None = Field(None, description="Description of the package")
    price: Decimal = Field(..., ge=0, description="Package combined price in NPR")
    is_active: bool = Field(True, description="Whether package is active for order booking")
    category_id: UUID | None = Field(None, description="Optional category for grouping")


class TestPackageCreate(TestPackageBase):
    """Payload to create a new health package."""

    lab_id: UUID | None = Field(default=None, description="Branch lab ID (defaults to primary if omitted)")


class TestPackageUpdate(BaseModel):
    """Payload to update an existing health package."""

    category_id: UUID | None = None
    name: str | None = Field(None, min_length=1, max_length=200)
    code: str | None = Field(None, max_length=50)
    description: str | None = None
    price: Decimal | None = Field(None, ge=0)
    is_active: bool | None = None


class TestPackageItemCreate(BaseModel):
    """Payload to add a test or individual analyte to a package."""

    test_id: UUID = Field(..., description="ID of test to include in package")
    parameter_id: UUID | None = Field(None, description="Optional ID of specific analyte within test")
    sort_order: int = Field(0, description="Display order within package")


class TestPackageItemResponse(BaseModel):
    """Schema representing an item within a package."""

    id: UUID
    package_id: UUID
    test_id: UUID
    parameter_id: UUID | None = None
    sort_order: int
    test_name: str | None = None
    test_code: str | None = None
    parameter_name: str | None = None

    model_config = ConfigDict(from_attributes=True)


class TestPackageResponse(BaseModel):
    """Schema for test package summary."""

    id: UUID
    lab_id: UUID
    category_id: UUID | None = None
    name: str
    code: str | None = None
    description: str | None = None
    price: Decimal
    is_active: bool
    test_count: int = 0
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class TestPackageDetailResponse(TestPackageResponse):
    """Detailed package response including bundled test items."""

    items: list[TestPackageItemResponse] = Field(default_factory=list)
