from typing import Literal

from pydantic import BaseModel, EmailStr, Field, field_validator

from src.core.constants import CemeteryType, ACCENT_COLORS

# Allowed URL prefixes for logo_url.  Production requires HTTPS S3/CloudFront.
# localhost is permitted as a dev fallback (local file storage when S3 unavailable).
_ALLOWED_LOGO_URL_PREFIXES = (
    "https://s3.",
    "https://s3-",
    "https://indelis-",
    "https://d16xufzn5inupa.cloudfront.net/",
    "http://localhost",   # dev: local /uploads static mount
    "http://127.0.0.1",  # dev: alternate loopback
)


class OnboardingCompleteRequest(BaseModel):
    organization_name: str = Field(..., min_length=1, max_length=255)
    cemetery_type: CemeteryType
    address: str = Field(..., min_length=1, max_length=500)
    contact_email: EmailStr
    import_method: Literal["fresh"]
    public_site_name: str = Field(..., min_length=1, max_length=255)
    accent_color: str
    logo_url: str = Field(..., min_length=1, max_length=2048)  # S3 URL

    @field_validator("accent_color")
    @classmethod
    def _validate_accent_color(cls, v: str) -> str:
        if v not in ACCENT_COLORS:
            raise ValueError(f"accent_color must be one of: {', '.join(sorted(ACCENT_COLORS))}")
        return v

    @field_validator("logo_url")
    @classmethod
    def _validate_logo_url(cls, v: str) -> str:
        """Restrict logo_url to HTTPS S3/CloudFront URLs to prevent SSRF.

        Rejects javascript:, data:, http: schemes and arbitrary external hosts.
        """
        if not any(v.startswith(prefix) for prefix in _ALLOWED_LOGO_URL_PREFIXES):
            raise ValueError(
                "logo_url must be an HTTPS URL pointing to INDELIS S3 or CloudFront storage"
            )
        return v
