from __future__ import annotations from dataclasses import dataclass from datetime import UTC, datetime from admin_app.core.settings import AdminSettings from shared.contracts import ServiceName, ToolLifecycleStatus, ToolParameterType @dataclass(frozen=True) class BootstrapToolCatalogEntry: tool_name: str display_name: str description: str domain: str parameter_count: int _BOOTSTRAP_TOOL_CATALOG: tuple[BootstrapToolCatalogEntry, ...] = ( BootstrapToolCatalogEntry( tool_name="consultar_estoque", display_name="Consultar estoque", description="Consulta veiculos disponiveis no estoque comercial.", domain="vendas", parameter_count=4, ), BootstrapToolCatalogEntry( tool_name="validar_cliente_venda", display_name="Validar cliente para venda", description="Avalia elegibilidade de credito para operacoes de venda.", domain="vendas", parameter_count=2, ), BootstrapToolCatalogEntry( tool_name="avaliar_veiculo_troca", display_name="Avaliar veiculo de troca", description="Estima o valor de entrada de um veiculo usado.", domain="vendas", parameter_count=3, ), BootstrapToolCatalogEntry( tool_name="agendar_revisao", display_name="Agendar revisao", description="Abre um agendamento de revisao ou manutencao.", domain="revisao", parameter_count=6, ), BootstrapToolCatalogEntry( tool_name="listar_agendamentos_revisao", display_name="Listar agendamentos de revisao", description="Consulta a fila de agendamentos de revisao do cliente.", domain="revisao", parameter_count=3, ), BootstrapToolCatalogEntry( tool_name="cancelar_agendamento_revisao", display_name="Cancelar agendamento de revisao", description="Cancela um agendamento existente por protocolo.", domain="revisao", parameter_count=2, ), BootstrapToolCatalogEntry( tool_name="editar_data_revisao", display_name="Editar data de revisao", description="Remarca uma revisao para um novo horario.", domain="revisao", parameter_count=2, ), BootstrapToolCatalogEntry( tool_name="realizar_pedido", display_name="Realizar pedido", description="Efetiva um pedido de compra com o veiculo escolhido.", domain="vendas", parameter_count=2, ), BootstrapToolCatalogEntry( tool_name="listar_pedidos", display_name="Listar pedidos", description="Consulta pedidos ja abertos pelo cliente.", domain="vendas", parameter_count=3, ), BootstrapToolCatalogEntry( tool_name="cancelar_pedido", display_name="Cancelar pedido", description="Cancela um pedido existente com motivo registrado.", domain="vendas", parameter_count=2, ), BootstrapToolCatalogEntry( tool_name="consultar_frota_aluguel", display_name="Consultar frota de aluguel", description="Lista veiculos disponiveis para locacao.", domain="locacao", parameter_count=6, ), BootstrapToolCatalogEntry( tool_name="abrir_locacao_aluguel", display_name="Abrir locacao de aluguel", description="Inicia um contrato de locacao de veiculo.", domain="locacao", parameter_count=7, ), BootstrapToolCatalogEntry( tool_name="registrar_devolucao_aluguel", display_name="Registrar devolucao de aluguel", description="Fecha uma locacao e devolve o veiculo para a frota.", domain="locacao", parameter_count=4, ), BootstrapToolCatalogEntry( tool_name="registrar_pagamento_aluguel", display_name="Registrar pagamento de aluguel", description="Registra comprovantes e pagamentos de contratos de locacao.", domain="locacao", parameter_count=7, ), BootstrapToolCatalogEntry( tool_name="limpar_contexto_conversa", display_name="Limpar contexto de conversa", description="Reinicia o contexto operacional atual do atendimento.", domain="orquestracao", parameter_count=1, ), BootstrapToolCatalogEntry( tool_name="continuar_proximo_pedido", display_name="Continuar proximo pedido", description="Retoma o proximo pedido pendente do fluxo atual.", domain="orquestracao", parameter_count=0, ), BootstrapToolCatalogEntry( tool_name="descartar_pedidos_pendentes", display_name="Descartar pedidos pendentes", description="Descarta apenas a fila pendente de pedidos do contexto.", domain="orquestracao", parameter_count=1, ), BootstrapToolCatalogEntry( tool_name="cancelar_fluxo_atual", display_name="Cancelar fluxo atual", description="Interrompe o fluxo corrente sem apagar todo o contexto.", domain="orquestracao", parameter_count=1, ), ) _LIFECYCLE_DESCRIPTIONS = { ToolLifecycleStatus.DRAFT: "Estado inicial de uma tool ainda em definicao.", ToolLifecycleStatus.GENERATED: "Implementacao gerada e pronta para analise tecnica.", ToolLifecycleStatus.VALIDATED: "Tool validada automaticamente com verificacoes basicas.", ToolLifecycleStatus.APPROVED: "Versao revisada e aprovada para publicacao controlada.", ToolLifecycleStatus.ACTIVE: "Tool publicada e apta a abastecer o runtime de produto.", ToolLifecycleStatus.FAILED: "Falha registrada na geracao, validacao ou ativacao.", ToolLifecycleStatus.ARCHIVED: "Versao retirada de circulacao e mantida apenas para historico.", } _PARAMETER_TYPE_DESCRIPTIONS = { ToolParameterType.STRING: "Texto livre, codigos e identificadores.", ToolParameterType.INTEGER: "Valores inteiros para limites, anos e contagens.", ToolParameterType.NUMBER: "Valores numericos decimais, como preco e diaria.", ToolParameterType.BOOLEAN: "Marcadores verdadeiro ou falso para decisoes operacionais.", ToolParameterType.OBJECT: "Estruturas compostas para payloads complexos.", ToolParameterType.ARRAY: "Colecoes ordenadas de valores.", } class ToolManagementService: def __init__(self, settings: AdminSettings): self.settings = settings def build_overview_payload(self) -> dict: catalog = self.list_publication_catalog() return { "mode": "bootstrap_catalog", "metrics": [ { "key": "active_catalog", "label": "Tools mapeadas", "value": str(len(catalog)), "description": "Catalogo bootstrap refletindo a base de tools conhecida no monorepo.", }, { "key": "lifecycle_stages", "label": "Etapas de lifecycle", "value": str(len(ToolLifecycleStatus)), "description": "Estados compartilhados entre governanca administrativa e publicacao.", }, { "key": "parameter_types", "label": "Tipos de parametro", "value": str(len(ToolParameterType)), "description": "Tipos aceitos pelo contrato inicial de publicacao de tools.", }, { "key": "draft_persistence", "label": "Persistencia de drafts", "value": "pendente", "description": "A fase atual entrega as superficies e o contrato; entidades de draft ainda nao existem.", }, ], "workflow": self.build_lifecycle_payload(), "next_steps": [ "Criar entidades administrativas para ToolDraft, ToolValidationRun e ToolPublication.", "Ligar o formulario de cadastro de novas tools a uma persistencia propria do admin.", "Abrir filas de revisao, aprovacao e ativacao com auditoria ponta a ponta.", ], } def build_contracts_payload(self) -> dict: return { "publication_source_service": ServiceName.ADMIN, "publication_target_service": ServiceName.PRODUCT, "lifecycle_statuses": self.build_lifecycle_payload(), "parameter_types": [ { "code": parameter_type, "label": parameter_type.value.upper(), "description": _PARAMETER_TYPE_DESCRIPTIONS[parameter_type], } for parameter_type in ToolParameterType ], "publication_fields": [ "source_service", "target_service", "publication_id", "published_tool", "emitted_at", ], "published_tool_fields": [ "tool_name", "display_name", "description", "version", "status", "parameters", "implementation_module", "implementation_callable", "checksum", "published_at", "published_by", ], } def build_drafts_payload(self) -> dict: return { "storage_status": "pending_persistence", "message": ( "As rotas de gestao de tools ja existem, mas a persistencia de ToolDraft ainda sera criada nas proximas etapas." ), "drafts": [], "supported_statuses": [ToolLifecycleStatus.DRAFT], } def build_review_queue_payload(self) -> dict: return { "queue_mode": "bootstrap_empty_state", "message": ( "A fila de revisao ainda opera em estado vazio ate a criacao das entidades de geracao e validacao." ), "items": [], "supported_statuses": [ ToolLifecycleStatus.GENERATED, ToolLifecycleStatus.VALIDATED, ToolLifecycleStatus.APPROVED, ToolLifecycleStatus.FAILED, ], } def build_publications_payload(self) -> dict: return { "source": "bootstrap_catalog", "target_service": ServiceName.PRODUCT, "publications": self.list_publication_catalog(), } def build_lifecycle_payload(self) -> list[dict]: return [ { "code": status, "label": status.value.replace("_", " ").title(), "description": _LIFECYCLE_DESCRIPTIONS[status], } for status in ToolLifecycleStatus ] def list_publication_catalog(self) -> list[dict]: published_at = datetime.now(UTC) return [ { "publication_id": f"bootstrap::{entry.tool_name}::v1", "tool_name": entry.tool_name, "display_name": entry.display_name, "description": entry.description, "domain": entry.domain, "version": 1, "status": ToolLifecycleStatus.ACTIVE, "parameter_count": entry.parameter_count, "implementation_module": "app.services.tools.handlers", "implementation_callable": entry.tool_name, "published_by": "bootstrap_catalog", "published_at": published_at, } for entry in _BOOTSTRAP_TOOL_CATALOG ]