from django.core.management.base import BaseCommand

from template_library.models import FormTemplate, FormTemplateField, ReusableTemplate, TemplateCategory


class Command(BaseCommand):
    help = "Cria categorias, conteúdos reutilizáveis e formulários iniciais da Kreate4Web."

    def handle(self, *args, **options):
        categories = {}
        for code, name, description, icon, tone, order in [
            ("comunicacao", "Comunicação com clientes", "Emails, avisos, mensagens de portal e respostas rápidas.", "forum", "yellow", 10),
            ("comercial", "Comercial e propostas", "Orçamentos, briefings, adesões e propostas de serviços.", "handshake", "blue", 20),
            ("suporte", "Suporte e manutenção", "Tickets, diagnósticos, checklists e respostas técnicas.", "support_agent", "orange", 30),
            ("financeiro", "Financeiro", "Pagamentos, faturação, cobranças e comprovativos.", "payments", "green", 40),
            ("documentacao", "Documentação", "Contratos, relatórios, termos e documentos entregáveis.", "description", "violet", 50),
            ("infraestrutura", "Infraestrutura", "Alojamentos, domínios, backups, SSL e servidores.", "dns", "grey", 60),
        ]:
            categories[code], _ = TemplateCategory.objects.update_or_create(
                code=code,
                defaults={
                    "name": name,
                    "description": description,
                    "icon": icon,
                    "tone": tone,
                    "sort_order": order,
                    "is_active": True,
                },
            )

        sample = {
            "cliente": "Acácia Studio",
            "servico": "Alojamento Business 10 GB",
            "dominio": "acaciastudio.pt",
            "ticket": "K4W-000001",
            "data": "30/06/2026",
            "valor": "120,00 €",
            "empresa": "Kreate4Web",
            "tecnico": "Equipa Kreate4Web",
        }
        reusable = [
            {
                "code": "ticket-resposta-inicial",
                "name": "Ticket — confirmação de receção",
                "kind": ReusableTemplate.Kind.TICKET_REPLY,
                "category": categories["suporte"],
                "subject_template": "Recebemos o pedido {ticket}",
                "body_template": "Olá {cliente},\n\nRecebemos o seu pedido {ticket} relativo a {servico}. A nossa equipa irá analisar a situação e responder assim que possível.\n\nCumprimentos,\n{empresa}",
                "variables": "{cliente} — nome do cliente\n{ticket} — referência do ticket\n{servico} — serviço associado\n{empresa} — nome da empresa",
                "visible_to_clients": True,
                "description": "Resposta rápida para confirmar a receção de um pedido de suporte.",
            },
            {
                "code": "ticket-pedido-informacao",
                "name": "Ticket — pedir informação adicional",
                "kind": ReusableTemplate.Kind.TICKET_REPLY,
                "category": categories["suporte"],
                "subject_template": "Informação adicional necessária — {ticket}",
                "body_template": "Olá {cliente},\n\nPara continuarmos a analisar o ticket {ticket}, precisamos que nos envie:\n\n- captura de ecrã do erro;\n- hora aproximada da ocorrência;\n- dispositivo e navegador utilizados.\n\nObrigado,\n{tecnico}",
                "variables": "{cliente}\n{ticket}\n{tecnico}",
                "visible_to_clients": True,
                "description": "Checklist curta para recolher informação técnica adicional.",
            },
            {
                "code": "ticket-resolucao",
                "name": "Ticket — resolução comunicada",
                "kind": ReusableTemplate.Kind.TICKET_REPLY,
                "category": categories["suporte"],
                "subject_template": "Resolução do ticket {ticket}",
                "body_template": "Olá {cliente},\n\nA intervenção relativa ao ticket {ticket} foi concluída. Por favor, confirme se o serviço {servico} está a funcionar corretamente.\n\nCaso esteja tudo resolvido, pode marcar o pedido como resolvido no portal.\n\n{empresa}",
                "variables": "{cliente}\n{ticket}\n{servico}\n{empresa}",
                "visible_to_clients": True,
                "description": "Mensagem para comunicar uma resolução e pedir validação ao cliente.",
            },
            {
                "code": "checklist-publicacao-website",
                "name": "Checklist de publicação de website",
                "kind": ReusableTemplate.Kind.CHECKLIST,
                "category": categories["suporte"],
                "subject_template": "Checklist de publicação — {dominio}",
                "body_template": "□ Backup completo\n□ DNS confirmado\n□ Certificado SSL ativo\n□ Formulários testados\n□ Emails transacionais testados\n□ Analytics configurado\n□ Política de privacidade publicada\n□ Teste mobile concluído\n□ Cliente informado",
                "variables": "{dominio} — domínio a publicar",
                "description": "Lista operacional antes de colocar um website em produção.",
            },
            {
                "code": "relatorio-manutencao-mensal",
                "name": "Relatório mensal de manutenção",
                "kind": ReusableTemplate.Kind.REPORT,
                "category": categories["documentacao"],
                "subject_template": "Relatório de manutenção — {servico} — {data}",
                "body_template": "Cliente: {cliente}\nServiço: {servico}\nData: {data}\n\nIntervenções realizadas:\n- Atualizações de segurança;\n- verificação de backups;\n- teste do certificado SSL;\n- validação de formulários;\n- revisão do estado geral do website.\n\nObservações:\n[Preencher]\n\nResponsável: {tecnico}",
                "variables": "{cliente}\n{servico}\n{data}\n{tecnico}",
                "description": "Base para o relatório periódico de manutenção.",
            },
            {
                "code": "contrato-servicos-recorrentes",
                "name": "Contrato de serviços recorrentes",
                "kind": ReusableTemplate.Kind.CONTRACT,
                "category": categories["documentacao"],
                "subject_template": "Contrato de prestação de serviços — {cliente}",
                "body_template": "Entre a Kreate4Web e {cliente} é acordada a prestação do serviço {servico}, associado ao domínio {dominio}, pelo valor de {valor}.\n\nPeriodicidade, condições de renovação, responsabilidades, proteção de dados e condições de cancelamento devem ser completadas antes da utilização real deste documento.\n\nDocumento de demonstração — requer validação jurídica.",
                "variables": "{cliente}\n{servico}\n{dominio}\n{valor}",
                "description": "Estrutura de demonstração para contratos; não substitui revisão jurídica.",
            },
            {
                "code": "nota-cobranca-amigavel",
                "name": "Cobrança — lembrete amigável",
                "kind": ReusableTemplate.Kind.INVOICE_NOTE,
                "category": categories["financeiro"],
                "subject_template": "Lembrete de pagamento — {servico}",
                "body_template": "Olá {cliente},\n\nVerificámos que permanece pendente o valor de {valor} relativo ao serviço {servico}. Caso já tenha efetuado o pagamento, agradecemos o envio do comprovativo através do portal.\n\nObrigado,\n{empresa}",
                "variables": "{cliente}\n{valor}\n{servico}\n{empresa}",
                "visible_to_clients": True,
                "description": "Mensagem de cobrança com tom cordial.",
            },
            {
                "code": "aviso-manutencao-programada",
                "name": "Aviso de manutenção programada",
                "kind": ReusableTemplate.Kind.PORTAL_NOTICE,
                "category": categories["infraestrutura"],
                "subject_template": "Manutenção programada — {servico}",
                "body_template": "Informamos que o serviço {servico} poderá ter indisponibilidade temporária no dia {data}. A intervenção será acompanhada pela equipa Kreate4Web.",
                "variables": "{servico}\n{data}",
                "visible_to_clients": True,
                "description": "Aviso genérico para manutenções de infraestrutura.",
            },
        ]
        for item in reusable:
            code = item.pop("code")
            ReusableTemplate.objects.update_or_create(
                code=code,
                defaults={**item, "example_context": sample, "is_active": True},
            )

        forms = [
            {
                "code": "briefing-website",
                "name": "Briefing para novo website",
                "purpose": FormTemplate.Purpose.WEBSITE,
                "category": categories["comercial"],
                "description": "Recolha inicial de objetivos, conteúdos, público e funcionalidades.",
                "intro_text": "Ajude-nos a compreender o projeto. Quanto mais detalhada for a informação, mais rigorosa será a proposta.",
                "visible_to_clients": True,
                "fields": [
                    (10, "Nome do projeto", "project_name", "text", True, "Ex.: Novo website institucional", ""),
                    (20, "Objetivo principal", "main_goal", "textarea", True, "O que pretende alcançar?", ""),
                    (30, "Público-alvo", "target_audience", "textarea", True, "Quem irá utilizar o website?", ""),
                    (40, "Website atual", "current_website", "url", False, "https://", ""),
                    (50, "Funcionalidades pretendidas", "features", "textarea", True, "Formulários, área reservada, loja, agenda...", ""),
                    (60, "Prazo desejado", "desired_deadline", "date", False, "", ""),
                    (70, "Referências visuais", "visual_references", "textarea", False, "Sites ou estilos de que gosta", ""),
                    (80, "Anexos", "attachments", "file", False, "", ""),
                ],
            },
            {
                "code": "adesao-cliente",
                "name": "Ficha de adesão de cliente",
                "purpose": FormTemplate.Purpose.CLIENT_ONBOARDING,
                "category": categories["comercial"],
                "description": "Dados necessários para criar uma ficha de cliente e preparar a faturação.",
                "intro_text": "Preencha os dados da entidade e do responsável principal.",
                "visible_to_clients": False,
                "fields": [
                    (10, "Nome / empresa", "client_name", "text", True, "", ""),
                    (20, "NIF", "nif", "text", True, "", ""),
                    (30, "Email principal", "email", "email", True, "nome@empresa.pt", ""),
                    (40, "Telefone", "phone", "phone", True, "+351", ""),
                    (50, "Morada", "address", "textarea", True, "", ""),
                    (60, "Método de pagamento", "payment_method", "select", True, "", "MB WAY\nTransferência bancária"),
                    (70, "Aceitação de comunicações operacionais", "operational_consent", "checkbox", True, "Aceito receber avisos relacionados com os serviços", ""),
                ],
            },
            {
                "code": "pedido-suporte-tecnico",
                "name": "Diagnóstico de suporte técnico",
                "purpose": FormTemplate.Purpose.SUPPORT,
                "category": categories["suporte"],
                "description": "Formulário detalhado para recolher informação antes do diagnóstico.",
                "intro_text": "Descreva a ocorrência e anexe evidências sempre que possível.",
                "visible_to_clients": True,
                "fields": [
                    (10, "Serviço afetado", "service", "select", True, "", "Website\nAlojamento\nDomínio\nEmail\nSSL\nOutro"),
                    (20, "Descrição do problema", "description", "textarea", True, "O que aconteceu?", ""),
                    (30, "Quando começou", "started_at", "date", False, "", ""),
                    (40, "Impacto", "impact", "radio", True, "", "Sem impacto crítico\nFuncionalidade limitada\nServiço indisponível"),
                    (50, "URL afetada", "affected_url", "url", False, "https://", ""),
                    (60, "Captura de ecrã", "screenshot", "file", False, "", ""),
                ],
            },
            {
                "code": "pedido-dominio",
                "name": "Pedido de registo ou transferência de domínio",
                "purpose": FormTemplate.Purpose.DOMAIN,
                "category": categories["infraestrutura"],
                "description": "Dados essenciais para registo, transferência ou gestão DNS.",
                "intro_text": "Indique o domínio e a operação pretendida.",
                "visible_to_clients": True,
                "fields": [
                    (10, "Domínio", "domain", "text", True, "exemplo.pt", ""),
                    (20, "Operação", "operation", "select", True, "", "Novo registo\nTransferência para a Kreate4Web\nAlteração de DNS\nRenovação\nCancelamento"),
                    (30, "AuthCode / referência", "authcode_reference", "text", False, "Não envie passwords", ""),
                    (40, "Observações", "notes", "textarea", False, "", ""),
                ],
            },
            {
                "code": "comprovativo-pagamento",
                "name": "Envio de comprovativo de pagamento",
                "purpose": FormTemplate.Purpose.PAYMENT,
                "category": categories["financeiro"],
                "description": "Estrutura usada para recolher dados de um pagamento manual.",
                "intro_text": "Associe o comprovativo ao serviço ou à renovação correta.",
                "visible_to_clients": True,
                "fields": [
                    (10, "Referência", "reference", "text", True, "Ex.: renovação de dominio.pt", ""),
                    (20, "Valor", "amount", "number", True, "0,00", ""),
                    (30, "Data do pagamento", "paid_on", "date", True, "", ""),
                    (40, "Método", "method", "select", True, "", "MB WAY\nTransferência bancária\nOutro"),
                    (50, "Comprovativo", "proof", "file", True, "", ""),
                ],
            },
            {
                "code": "satisfacao-servico",
                "name": "Avaliação de satisfação",
                "purpose": FormTemplate.Purpose.SATISFACTION,
                "category": categories["comunicacao"],
                "description": "Feedback após resolução de um ticket ou conclusão de um projeto.",
                "intro_text": "A sua opinião ajuda-nos a melhorar o serviço.",
                "visible_to_clients": True,
                "fields": [
                    (10, "Avaliação global", "rating", "radio", True, "", "1 — Fraco\n2 — Insuficiente\n3 — Bom\n4 — Muito bom\n5 — Excelente"),
                    (20, "O que correu bem?", "positive", "textarea", False, "", ""),
                    (30, "O que podemos melhorar?", "improvements", "textarea", False, "", ""),
                    (40, "Autoriza testemunho público?", "testimonial", "checkbox", False, "Sim, autorizo após validação", ""),
                ],
            },
        ]

        for item in forms:
            field_defs = item.pop("fields")
            code = item.pop("code")
            form, _ = FormTemplate.objects.update_or_create(
                code=code,
                defaults={**item, "is_active": True, "requires_authentication": True},
            )
            existing_keys = set()
            for order, label, key, field_type, required, placeholder, options_text in field_defs:
                existing_keys.add(key)
                FormTemplateField.objects.update_or_create(
                    form_template=form,
                    key=key,
                    defaults={
                        "label": label,
                        "field_type": field_type,
                        "required": required,
                        "placeholder": placeholder,
                        "options": options_text,
                        "sort_order": order,
                        "is_active": True,
                    },
                )
            form.fields.exclude(key__in=existing_keys).delete()

        self.stdout.write(self.style.SUCCESS("Biblioteca de templates e formulários criada/atualizada."))
