"""
Attribution Models
Models for license and attribution tracking
"""
from typing import Optional
from pydantic import BaseModel, Field


class AttributionSource(BaseModel):
    """
    Attribution information for a data source.

    All geographic data requires proper attribution per their licenses.
    """
    name: str = Field(..., description="Source name")
    license: str = Field(..., description="License name")
    url: str = Field(..., description="License or source URL")
    attribution: str = Field(..., description="Required attribution text")
    required: bool = Field(True, description="Whether attribution is legally required")
    logo_url: Optional[str] = Field(None, description="Optional logo URL")


class Attribution(BaseModel):
    """
    Complete attribution information for an AOI bundle.

    Ensures DSGVO/GDPR compliance and proper data source attribution.
    """
    sources: list[AttributionSource] = Field(
        ...,
        description="List of data sources requiring attribution",
    )
    generated_at: str = Field(..., description="Timestamp when attribution was generated")
    notice: str = Field(
        "This data must be attributed according to the licenses above when used publicly.",
        description="General attribution notice",
    )

    class Config:
        json_schema_extra = {
            "example": {
                "sources": [
                    {
                        "name": "OpenStreetMap",
                        "license": "Open Database License (ODbL) v1.0",
                        "url": "https://www.openstreetmap.org/copyright",
                        "attribution": "© OpenStreetMap contributors",
                        "required": True,
                    },
                    {
                        "name": "Copernicus DEM",
                        "license": "Copernicus Data License",
                        "url": "https://spacedata.copernicus.eu/",
                        "attribution": "© Copernicus Service Information 2024",
                        "required": True,
                    },
                ],
                "generated_at": "2024-01-15T12:00:00Z",
                "notice": "This data must be attributed according to the licenses above when used publicly.",
            }
        }


# Predefined attribution sources
OSM_ATTRIBUTION = AttributionSource(
    name="OpenStreetMap",
    license="Open Database License (ODbL) v1.0",
    url="https://www.openstreetmap.org/copyright",
    attribution="© OpenStreetMap contributors",
    required=True,
)

COPERNICUS_ATTRIBUTION = AttributionSource(
    name="Copernicus DEM",
    license="Copernicus Data License",
    url="https://spacedata.copernicus.eu/",
    attribution="© Copernicus Service Information 2024",
    required=True,
)

OPENAERIAL_ATTRIBUTION = AttributionSource(
    name="OpenAerialMap",
    license="CC-BY 4.0",
    url="https://openaerialmap.org/",
    attribution="© OpenAerialMap contributors",
    required=True,
)


def get_default_attribution() -> Attribution:
    """Get default attribution with standard sources."""
    from datetime import datetime

    return Attribution(
        sources=[OSM_ATTRIBUTION, COPERNICUS_ATTRIBUTION],
        generated_at=datetime.utcnow().isoformat(),
    )
