workspace "Garantora" "Modelo C4 da plataforma Garantora — SaaS B2B de gestão de garantias imobiliárias." {

    !identifiers hierarchical

    model {
        tenantUser = person "Usuário da garantidora" "ADMIN_TENANT, ANALYST, OPERATOR ou VIEWER."
        agencyUser = person "Usuário de imobiliária" "AGENCY_USER ou AGENCY_MANAGER, escopado a uma partner_agency_id."
        platformAdmin = person "Admin da plataforma" "ADMIN_GLOBAL — administra garantidoras, não dado de negócio do cliente."

        mailServer = softwareSystem "Servidor de e-mail" "Mailpit em dev, AWS SES em produção." "External"
        apiFull = softwareSystem "API Full" "Consultas de crédito (bureaus) e extrato de créditos — integrado (specs 0050 e 0052)." "External"
        viaCep = softwareSystem "ViaCEP" "Endereço a partir do CEP." "External"
        autentique = softwareSystem "Autentique" "Assinatura digital + biometria facial — previsto, não integrado (ver docs/roadmap.md)." "External,Planned"
        boletoIssuer = softwareSystem "Emissor de boleto" "Cobrança do setup e da 1ª parcela — previsto, não integrado." "External,Planned"

        garantora = softwareSystem "Garantora" "SaaS multi-tenant de gestão de garantias imobiliárias." {
            web = container "apps/web" "Refine v5 + React 19 + MUI v9. PWA instalável, responsivo (desktop e 375px). Build estático servido por nginx." "TypeScript / Vite" "Web Browser"
            api = container "apps/api" "FastAPI + SQLAlchemy 2.x async. Router → Service → Repository → Model, RBAC por resource:action. Uma transação por requisição (CommitRoute)." "Python / FastAPI" {
                router = component "Routers" "Valida input via Pydantic, delega ao service. Fino — sem regra de negócio." "api/v1/routers/"
                service = component "Services" "Regra de negócio, transição de estado, escopo (scoping.py), log de auditoria." "services/"
                domain = component "Domain" "Regra pura, sem I/O — canal, encargo, mensalidade, adesão, resumo e acerto da cobrança." "domain/"
                providers = component "Integrações" "Clientes de terceiros: API Full (credit_check_provider/), ViaCEP, SMTP." "services/"
                repository = component "Repositories" "BaseRepository[T] — CRUD assíncrono genérico, filtro de tenant automático." "repositories/"
                model = component "Models" "SQLAlchemy ORM, um arquivo por entidade de domínio." "models/"

                router -> service "chama"
                service -> domain "aplica regra pura"
                service -> repository "chama"
                service -> providers "chama"
                repository -> model "mapeia"
            }
            worker = container "worker" "Mesma imagem da api, processo arq: consultas de crédito (run_credit_check_job) e os jobs agendados das 6h (extrato, preço, purga) e 7h (cobrança vencida)." "Python / arq"
            db = container "PostgreSQL" "Dados de negócio, multi-tenant lógico (tenant_id em toda entidade); arquivos dos documentos." "PostgreSQL 16" "Database"
            redis = container "Redis" "Só a fila do arq." "Redis 7" "Database"

            web -> api "chama /api/v1/... via fetch, mesma origem, JWT Bearer" "HTTPS/JSON"
            api -> db "lê e escreve" "asyncpg"
            api -> redis "enfileira a consulta de crédito, depois do COMMIT"
            worker -> redis "consome a fila; cron 6h e 7h"
            worker -> db "lê e escreve" "asyncpg"
        }

        e2e = softwareSystem "apps/e2e" "Suíte Playwright — roda contra o dev-remote, nunca contra produção nem um ambiente isolado." "Test Suite"

        tenantUser -> garantora.web "opera análises, garantias e cadastros" "HTTPS"
        agencyUser -> garantora.web "origina inquilino/imóvel, acompanha a análise, declara pagamentos do acerto" "HTTPS"
        platformAdmin -> garantora.web "administra garantidoras, convites, catálogo de consultas e a plataforma" "HTTPS"

        garantora.api -> mailServer "envia e-mail transacional (convite, recuperação de senha, verificação)" "SMTP"
        garantora.worker -> apiFull "executa a consulta de crédito, sincroniza o extrato" "HTTPS"
        garantora.api -> apiFull "valida o token, sincroniza o extrato sob demanda" "HTTPS"
        garantora.api -> viaCep "consulta CEP" "HTTPS"
        garantora -> autentique "assinatura digital + biometria (planejado)"
        garantora -> boletoIssuer "emissão de boleto (planejado)"

        e2e -> garantora.web "interage via browser, nunca chama a API direto"
    }

    views {
        systemContext garantora "SystemContext" "C4 nível 1 — contexto do sistema." {
            include *
            autoLayout
        }

        container garantora "Containers" "C4 nível 2 — os apps do monorepo, o worker e os serviços de dados." {
            include *
            autoLayout
        }

        component garantora.api "ApiComponents" "C4 nível 3 — as camadas da API." {
            include *
            autoLayout
        }

        styles {
            element "Person" {
                shape person
                background #1E5B4F
                color #ffffff
            }
            element "Software System" {
                background #0B7C6B
                color #ffffff
            }
            element "External" {
                background #94A3B8
                color #ffffff
            }
            element "Planned" {
                border dashed
            }
            element "Container" {
                background #0B7C6B
                color #ffffff
            }
            element "Database" {
                shape cylinder
            }
            element "Web Browser" {
                shape webBrowser
            }
            element "Test Suite" {
                background #64748B
                color #ffffff
            }
        }
    }
}
