from collections import OrderedDict


CLEANUP_GROUPS = OrderedDict(
    [
        (
            "clients",
            {
                "label": "Clientes e contactos",
                "description": "Clientes, contactos, notas e acessos associados ao portal.",
                "icon": "groups",
                "tone": "danger",
                "apps": ["clients"],
                "section": "Dados comerciais",
            },
        ),
        (
            "client_accounts",
            {
                "label": "Contas de clientes",
                "description": "Utilizadores associados a acessos de clientes. Nunca inclui a conta administrativa atual.",
                "icon": "person_remove",
                "tone": "danger",
                "special": "client_accounts",
                "section": "Dados comerciais",
            },
        ),
        (
            "services",
            {
                "label": "Serviços",
                "description": "Serviços recorrentes e não recorrentes, incluindo o respetivo histórico.",
                "icon": "inventory_2",
                "tone": "danger",
                "apps": ["services"],
                "section": "Dados comerciais",
            },
        ),
        (
            "domains",
            {
                "label": "Domínios",
                "description": "Domínios, estados, registadores associados e histórico.",
                "icon": "language",
                "tone": "warning",
                "apps": ["domains"],
                "section": "Dados comerciais",
            },
        ),
        (
            "hosting",
            {
                "label": "Alojamentos",
                "description": "Contas de alojamento e respetivo histórico.",
                "icon": "dns",
                "tone": "warning",
                "apps": ["hosting"],
                "section": "Dados comerciais",
            },
        ),
        (
            "websites",
            {
                "label": "Projetos web",
                "description": "Projetos de websites, valores e ligações a serviços.",
                "icon": "web",
                "tone": "warning",
                "apps": ["websites"],
                "section": "Dados comerciais",
            },
        ),
        (
            "billing",
            {
                "label": "Renovações e pagamentos",
                "description": "Todos os ciclos de renovação, pagamentos e respetivo histórico financeiro.",
                "icon": "payments",
                "tone": "danger",
                "apps": ["billing"],
                "section": "Financeiro e comunicações",
            },
        ),
        (
            "notifications",
            {
                "label": "Histórico de notificações",
                "description": "Mensagens preparadas/enviadas, tentativas de envio, bloqueios e respetivo histórico.",
                "icon": "notifications_off",
                "tone": "warning",
                "models": [
                    "notifications.NotificationAttempt",
                    "notifications.NotificationLog",
                    "notifications.HistoricalNotificationLog",
                    "notifications.EmailSuppression",
                    "notifications.HistoricalEmailSuppression",
                ],
                "section": "Financeiro e comunicações",
            },
        ),
        (
            "support",
            {
                "label": "Tickets e mensagens",
                "description": "Pedidos de suporte, respostas, anexos e histórico.",
                "icon": "support_agent",
                "tone": "danger",
                "apps": ["support"],
                "section": "Financeiro e comunicações",
            },
        ),
        (
            "documents",
            {
                "label": "Documentos",
                "description": "Contratos, faturas, comprovativos, relatórios e ficheiros associados.",
                "icon": "folder_delete",
                "tone": "warning",
                "models": ["core.Document", "core.HistoricalDocument"],
                "section": "Financeiro e comunicações",
            },
        ),
        (
            "operations",
            {
                "label": "Tarefas internas",
                "description": "Tarefas operacionais, prazos, responsáveis e histórico.",
                "icon": "task_alt",
                "tone": "warning",
                "apps": ["operations"],
                "section": "Operações e infraestrutura",
            },
        ),
        (
            "technical",
            {
                "label": "Infraestrutura técnica",
                "description": "Servidores, ativos técnicos, bases de dados, backups e históricos.",
                "icon": "storage",
                "tone": "danger",
                "apps": ["technical"],
                "section": "Operações e infraestrutura",
            },
        ),
        (
            "monitoring",
            {
                "label": "Monitorização e incidentes",
                "description": "Monitores, verificações, incidentes, histórico de disponibilidade e relações automáticas.",
                "icon": "monitor_heart",
                "tone": "danger",
                "apps": ["monitoring"],
                "section": "Operações e infraestrutura",
            },
        ),
        (
            "providers",
            {
                "label": "Fornecedores",
                "description": "Registadores, fornecedores de alojamento, cloud e pagamentos.",
                "icon": "business",
                "tone": "warning",
                "models": ["core.Provider", "core.HistoricalProvider"],
                "section": "Operações e infraestrutura",
            },
        ),
        (
            "imports",
            {
                "label": "Importações Excel",
                "description": "Lotes, linhas analisadas, ligações e ficheiros de importação.",
                "icon": "upload_file",
                "tone": "warning",
                "apps": ["imports"],
                "section": "Dados e conteúdos",
            },
        ),
        (
            "email_templates",
            {
                "label": "Templates de email",
                "description": "Modelos de mensagens automáticas e respetivo histórico de alterações.",
                "icon": "mail",
                "tone": "warning",
                "models": ["notifications.NotificationTemplate", "notifications.HistoricalNotificationTemplate"],
                "section": "Dados e conteúdos",
            },
        ),
        (
            "template_library",
            {
                "label": "Biblioteca de templates e formulários",
                "description": "Conteúdos reutilizáveis, formulários, campos, categorias e utilização.",
                "icon": "dashboard_customize",
                "tone": "warning",
                "apps": ["template_library"],
                "section": "Dados e conteúdos",
            },
        ),
        (
            "portal_configuration",
            {
                "label": "Configuração global do portal",
                "description": "Dados da empresa, IBAN, MB WAY e opções globais de comunicação.",
                "icon": "settings",
                "tone": "danger",
                "models": ["core.PortalConfiguration", "core.HistoricalPortalConfiguration"],
                "section": "Sistema e segurança",
            },
        ),
        (
            "security_client_data",
            {
                "label": "Segurança e 2FA dos clientes",
                "description": "Perfis, dispositivos 2FA, códigos de recuperação e eventos de clientes. A conta atual é preservada.",
                "icon": "security",
                "tone": "danger",
                "special": "security_client_data",
                "section": "Sistema e segurança",
            },
        ),
        (
            "other_staff_accounts",
            {
                "label": "Outros utilizadores administrativos",
                "description": "Elimina contas staff/superuser, exceto a conta administrativa que está a executar a operação.",
                "icon": "admin_panel_settings",
                "tone": "danger",
                "special": "other_staff_accounts",
                "section": "Sistema e segurança",
            },
        ),
        (
            "sessions_logs",
            {
                "label": "Sessões e registos administrativos",
                "description": "Sessões iniciadas e histórico técnico do Django Admin, preservando a sessão atual.",
                "icon": "history_toggle_off",
                "tone": "warning",
                "special": "sessions_logs",
                "section": "Sistema e segurança",
            },
        ),
        (
            "automation",
            {
                "label": "Agenda de automação",
                "description": "Tarefas periódicas e agendamentos do Celery Beat. Pode ser recriada pelo comando setup_notification_schedule.",
                "icon": "schedule",
                "tone": "danger",
                "apps": ["django_celery_beat"],
                "section": "Sistema e segurança",
            },
        ),
    ]
)


# Dependências destrutivas que devem ser incluídas para evitar registos órfãos
# ou bloqueios de integridade. A interface apresenta estes grupos antes da execução.
GROUP_DEPENDENCIES = {
    "clients": {
        "client_accounts",
        "services",
        "domains",
        "hosting",
        "websites",
        "billing",
        "notifications",
        "support",
        "documents",
        "operations",
        "technical",
        "monitoring",
        "imports",
        "security_client_data",
    },
    "services": {"domains", "hosting", "billing", "documents", "technical", "monitoring", "imports"},
    "billing": {"documents"},
    "support": {"documents"},
    "technical": {"monitoring"},
}


# Ordem manual para os modelos com PROTECT ou relações mais sensíveis.
MODEL_DELETE_ORDER = [
    "notifications.NotificationAttempt",
    "notifications.NotificationLog",
    "notifications.EmailSuppression",
    "notifications.NotificationTemplate",
    "support.SupportMessage",
    "core.Document",
    "support.SupportTicket",
    "operations.InternalTask",
    "billing.Payment",
    "billing.Renewal",
    "hosting.HostingAccount",
    "monitoring.MonitorIncident",
    "monitoring.MonitorCheck",
    "monitoring.WebsiteMonitor",
    "technical.WordPressPlugin",
    "technical.WordPressTheme",
    "technical.WordPressSite",
    "technical.SSLCertificate",
    "technical.BackupRecord",
    "technical.DatabaseAsset",
    "technical.TechnicalAsset",
    "websites.WebsiteProject",
    "domains.Domain",
    "services.Service",
    "clients.ClientNote",
    "clients.ClientContact",
    "clients.ClientPortalAccess",
    "clients.Client",
    "technical.Server",
    "core.Provider",
    "imports.ImportedObject",
    "imports.ImportRow",
    "imports.ImportBatch",
    "template_library.TemplateUsage",
    "template_library.FormTemplateField",
    "template_library.FormTemplate",
    "template_library.ReusableTemplate",
    "template_library.TemplateCategory",
    "core.PortalConfiguration",
    "django_celery_beat.PeriodicTask",
    "django_celery_beat.PeriodicTasks",
    "django_celery_beat.ClockedSchedule",
    "django_celery_beat.CrontabSchedule",
    "django_celery_beat.IntervalSchedule",
    "django_celery_beat.SolarSchedule",
]


FULL_RESET_GROUPS = list(CLEANUP_GROUPS.keys())
