import logging
from datetime import date
from typing import Optional, List
from sqlalchemy.ext.asyncio import AsyncSession
from models.omie_contrato import OmieContrato
from models.omie_contrato_servico import OmieContratoServico
from models.omie_contrato_departamento import OmieContratoDepartamento
from models.omie_contrato_vencimento import OmieContratoVencimento
from crud.omie_contratos import crud_contrato, crud_servico, crud_departamento, crud_vencimento

logger = logging.getLogger(__name__)

class OmieContratoService:
    @staticmethod
    async def listar(
        db: AsyncSession,
        *,
        cnpj: Optional[str] = None,
        codigo_contrato: Optional[str] = None,
        status: Optional[str] = None,
    ) -> List[OmieContrato]:
        """Lista contratos com filtros opcionais"""
        try:
            result = await crud_contrato.list(
                db, 
                cnpj=cnpj, 
                codigo_contrato=codigo_contrato, 
                status=status
            )
            return result
        except Exception as e:
            logger.error(f"Erro em OmieContratoService.listar: {e}", exc_info=True)
            raise

class OmieContratoServicoService:
    @staticmethod
    async def listar(
        db: AsyncSession,
        *,
        codigo_contrato: Optional[str] = None,
    ) -> List[OmieContratoServico]:
        """Lista serviços de contratos com filtro opcional"""
        try:
            result = await crud_servico.list(db, codigo_contrato=codigo_contrato)
            return result
        except Exception as e:
            logger.error(f"Erro em OmieContratoServicoService.listar: {e}", exc_info=True)
            raise

class OmieContratoDepartamentoService:
    @staticmethod
    async def listar(
        db: AsyncSession,
        *,
        codigo_contrato: Optional[str] = None,
    ) -> List[OmieContratoDepartamento]:
        """Lista departamentos de contratos com filtro opcional"""
        try:
            result = await crud_departamento.list(db, codigo_contrato=codigo_contrato)
            return result
        except Exception as e:
            logger.error(f"Erro em OmieContratoDepartamentoService.listar: {e}", exc_info=True)
            raise

class OmieContratoVencimentoService:
    @staticmethod
    async def listar(
        db: AsyncSession,
        *,
        codigo_contrato: Optional[str] = None,
        data_inicio: Optional[date] = None,
        data_fim: Optional[date] = None,
        status: Optional[str] = None,
    ) -> List[OmieContratoVencimento]:
        """Lista vencimentos de contratos com filtros opcionais"""
        try:
            result = await crud_vencimento.list(
                db, 
                codigo_contrato=codigo_contrato, 
                data_inicio=data_inicio, 
                data_fim=data_fim, 
                status=status
            )
            return result
        except Exception as e:
            logger.error(f"Erro em OmieContratoVencimentoService.listar: {e}", exc_info=True)
            raise