"""Schemas for the two-dimension service catalog (STATE-WP-0062)."""
import uuid
from datetime import datetime

from pydantic import BaseModel, ConfigDict


# ── Extension read models ────────────────────────────────────────────────────

class ServiceThirdPartyRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    pricing_model: str
    upstream_packages: list | None = None
    upstream_contacts: list | None = None
    source_url: str | None = None
    support_url: str | None = None
    license: str | None = None


class ServiceFirstPartyRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    repo_id: uuid.UUID | None = None
    owning_domain: str | None = None


class ServiceCloudRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    gdpr_maturity: str
    gdpr_notes: str | None = None
    dpa_available: bool
    tos_url: str | None = None
    privacy_policy_url: str | None = None
    data_processing_regions: list | None = None
    data_retention_notes: str | None = None


class ServiceSelfHostedRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    helix_instance: str | None = None
    host_node: str | None = None
    deployment_ref: str | None = None
    runbook_ref: str | None = None
    upstream_oss_project: str | None = None


class ServiceCatalogRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: uuid.UUID
    slug: str
    name: str
    owner_or_provider: str | None = None
    category: str | None = None
    description: str | None = None
    website_url: str | None = None
    status: str
    hosting_type: str
    development_type: str
    maturity_level: int | None = None
    created_at: datetime
    updated_at: datetime
    third_party: ServiceThirdPartyRead | None = None
    first_party: ServiceFirstPartyRead | None = None
    cloud: ServiceCloudRead | None = None
    self_hosted: ServiceSelfHostedRead | None = None


# ── Write (upsert) models ────────────────────────────────────────────────────

class ServiceThirdPartyIn(BaseModel):
    pricing_model: str = "unknown"
    upstream_packages: list | None = None
    upstream_contacts: list | None = None
    source_url: str | None = None
    support_url: str | None = None
    license: str | None = None


class ServiceFirstPartyIn(BaseModel):
    repo_id: uuid.UUID | None = None
    repo_slug: str | None = None
    owning_domain: str | None = None


class ServiceCloudIn(BaseModel):
    gdpr_maturity: str = "unknown"
    gdpr_notes: str | None = None
    dpa_available: bool = False
    tos_url: str | None = None
    privacy_policy_url: str | None = None
    data_processing_regions: list | None = None
    data_retention_notes: str | None = None


class ServiceSelfHostedIn(BaseModel):
    helix_instance: str | None = None
    host_node: str | None = None
    deployment_ref: str | None = None
    runbook_ref: str | None = None
    upstream_oss_project: str | None = None


class ServiceUpsert(BaseModel):
    slug: str
    name: str
    owner_or_provider: str | None = None
    category: str | None = None
    description: str | None = None
    website_url: str | None = None
    status: str = "active"
    hosting_type: str  # self_hosted | cloud_hosted
    development_type: str  # first_party | third_party
    maturity_level: int | None = None
    third_party: ServiceThirdPartyIn | None = None
    first_party: ServiceFirstPartyIn | None = None
    cloud: ServiceCloudIn | None = None
    self_hosted: ServiceSelfHostedIn | None = None
