from typing import Optional, List
from datetime import date, datetime, time
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
from src.apps.memorials.schemas.responses import MemorialForRecordResponse


class BurialInfoResponse(BaseModel):
    id: UUID
    record_id: UUID
    interment_type: Optional[str] = None
    interment_date: Optional[date] = None
    interment_time: Optional[time] = None
    casket_type: Optional[str] = None
    depth_m: Optional[float] = None
    officiant: Optional[str] = None
    attendees: Optional[int] = None
    service_notes: Optional[str] = None
    created_at: datetime

    model_config = {"from_attributes": True}


class FamilyContactResponse(BaseModel):
    id: UUID
    record_id: UUID
    relationship: Optional[str] = Field(None, alias="relationship_type")
    first_name: str
    last_name: str
    email: Optional[str] = None
    phone: Optional[str] = None
    address: Optional[str] = None
    is_primary: bool
    is_plot_owner: bool
    created_at: datetime

    model_config = {"from_attributes": True, "populate_by_name": True}


class RecordSummaryResponse(BaseModel):
    id: UUID
    first_name: str
    middle_name: Optional[str] = None
    last_name: str
    maiden_name: Optional[str] = None
    date_of_birth: Optional[date] = None
    date_of_death: Optional[date] = None
    gender: Optional[str] = None
    is_veteran: bool
    visibility_config: str
    status: str = "active"
    plot_id: Optional[UUID] = None
    plot_ref: Optional[str] = None
    section_code: Optional[str] = None
    date_interred: Optional[date] = None
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class RecordResponse(RecordSummaryResponse):
    nationality: Optional[str] = None
    religion: Optional[str] = None
    military_branch: Optional[str] = None
    photo_url: Optional[str] = None
    biography_draft: Optional[str] = None
    burial_info: Optional[BurialInfoResponse] = None
    family_contacts: List[FamilyContactResponse] = []
    memorial: Optional[MemorialForRecordResponse] = None


class AuditLogEntryResponse(BaseModel):
    model_config = ConfigDict(from_attributes=False)

    id: UUID
    user_id: Optional[UUID] = None
    user_first_name: Optional[str] = None
    user_last_name: Optional[str] = None
    entity_type: str
    entity_id: Optional[UUID] = None
    action: str
    old_value: Optional[dict] = None
    new_value: Optional[dict] = None
    ip_address: Optional[str] = None
    user_agent: Optional[str] = None
    created_at: datetime

    @classmethod
    def from_enriched(cls, enriched) -> "AuditLogEntryResponse":
        log = enriched.log
        return cls(
            id=log.id,
            user_id=log.user_id,
            user_first_name=enriched.user_first_name,
            user_last_name=enriched.user_last_name,
            entity_type=log.entity_type,
            entity_id=log.entity_id,
            action=log.action,
            old_value=log.old_value,
            new_value=log.new_value,
            ip_address=str(log.ip_address) if log.ip_address else None,
            user_agent=log.user_agent,
            created_at=log.created_at,
        )
