from ninja import Schema, ModelSchema, UploadedFile
from typing import List, Optional
from .models import TipoDiarioOficial
from datetime import date


class PaginaSchema(Schema):
    """Schema que representa uma página de um Diário Oficial.

    Attributes:
        numero (int): Número ordinal da página no Diário (começa em 1).
        conteudo (str): Texto extraído da página.
    """

    numero: int
    conteudo: str


class ResultadoSchema(Schema):
    """Schema de resposta para um Diário Oficial em resultados de busca.

    Attributes:
        id (int): ID único do Diário no banco de dados.
        numero (str): Número de identificação oficial do Diário (e.g., '123-A').
        data (str): Data de publicação no formato ISO (YYYY-MM-DD).
        link (str): URL para acessar o Diário Oficial online.
        tipo (str): Nome do tipo de Diário (e.g., 'Municipal', 'Federal').
        paginas (List[PaginaSchema]): Lista de páginas com conteúdo extraído.
        score (Optional[float]): Relevância do resultado (0 a 1), se aplicável.
    """

    id: int
    numero: str
    data: str
    link: str
    tipo: str
    paginas: List[PaginaSchema]
    score: Optional[float] = None


class BuscaDiariosResponseSchema(Schema):
    """Schema de resposta para buscas paginadas em Diários Oficiais.

    Attributes:
        total (int): Total de resultados disponíveis (ignorando paginação).
        resultados (List[ResultadoSchema]): Lista de Diários encontrados.
        pagina (int): Número da página atual (começa em 1).
        por_pagina (int): Quantidade de resultados por página.
    """

    total: int
    resultados: List[ResultadoSchema]
    pagina: int
    por_pagina: int


class SugestaoResponse(Schema):
    """Schema para sugestões de correção de busca (e.g., 'Voc quis dizer...?').

    Attributes:
        sugestao (Optional[str]): Termo sugerido para refinar a busca.
                          None se nenhuma sugestão for relevante.
    """

    sugestao: Optional[str]

class TipoDiarioSchema(ModelSchema):
    class Config:
        model = TipoDiarioOficial
        model_fields = ["id", "nome"]

class DiarioOficialIn(Schema):
    """Schema para criação de Diário Oficial"""
    data: date
    numero: str
    tipo_id: Optional[int] = None
    link: Optional[str] = None
    arquivo: Optional[UploadedFile] = None  # Adicionando o campo de arquivo

    class Config:
        # Configuração adicional para o Swagger UI
        json_schema_extra = {
            "example": {
                "data": "2023-12-01",
                "numero": "1234/2023",
            }
        }

class DiarioOficialOut(Schema):
    """Schema para retorno de Diário Oficial (com detalhes completos)"""
    id: int
    data: str  # Será formatado como ISO (YYYY-MM-DD)
    numero: str
    link: Optional[str]
    tipo: Optional[TipoDiarioSchema]
    total_paginas: int
    
    @staticmethod
    def resolve_data(obj):
        return obj.data.isoformat()
    
    @staticmethod
    def resolve_total_paginas(obj):
        return obj.paginas.count()

class DiarioOficialUpdate(Schema):
    """Schema para atualização de Diário Oficial"""
    data: Optional[date] = None
    numero: Optional[str] = None
    tipo_id: Optional[int] = None
    link: Optional[str] = None

class DiarioListagem(Schema):
    """Schema simplificado para listagem de Diários"""
    id: int
    data: str
    numero: str
    tipo_nome: Optional[str]
    
    @staticmethod
    def resolve_data(obj):
        return obj.data.isoformat()
    
    @staticmethod
    def resolve_tipo_nome(obj):
        return obj.tipo.nome if obj.tipo else None