<?php

namespace App\Support;

use Illuminate\Support\Carbon;

/**
 * Fake data for mockup/demo mode (MANIFEST_DEMO=true).
 * Lets The Manifest render fully populated without Notion access —
 * used for presentations and local development.
 *
 * IDs are fake-but-valid UUIDs so the existing routes match them.
 *
 * Nautical mapping (Pátio do Porto):
 *   Sprint = Vessel · Card (task) = Container · card number = container number
 */
class DemoManifest
{
    private const IDS = [
        'elgin'    => 'aaaaaaaa-0001-4bbb-8ccc-000000000001',
        'mobile'   => 'aaaaaaaa-0002-4bbb-8ccc-000000000002',
        'bookings' => 'aaaaaaaa-0003-4bbb-8ccc-000000000003',
        'address'  => 'aaaaaaaa-0004-4bbb-8ccc-000000000004',
        'company'  => 'aaaaaaaa-0005-4bbb-8ccc-000000000005',
        'peso'     => 'aaaaaaaa-0006-4bbb-8ccc-000000000006',
    ];

    /**
     * Vessels (sprints) — each carries the keys of the tasks (containers) aboard.
     */
    private const VESSELS = [
        'sprint-30' => [
            'label'  => 'Sprint 30',
            'voyage' => ['month' => 'Julho', 'in' => '30S', 'out' => '31S'],
            'status' => 'Em andamento',
            'period' => ['2026-06-16', '2026-07-01'],
            'tasks'  => ['elgin', 'mobile', 'company'],
            'pending' => ['number' => 'TBX 2331', 'title' => 'Ajuste no cálculo de frete internacional'],
        ],
        'sprint-29' => [
            'label'  => 'Sprint 29',
            'voyage' => ['month' => 'Junho', 'in' => '29S', 'out' => '30S'],
            'status' => 'Concluída',
            'period' => ['2026-06-01', '2026-06-15'],
            'tasks'  => ['bookings', 'address', 'peso'],
            'pending' => ['number' => 'TBX 2255', 'title' => 'Exportação de manifesto em PDF'],
        ],
    ];

    // ── Public API ───────────────────────────────────────────────────────────

    /**
     * Same shape as ManifestController::documentedTasks(): grouped by category.
     */
    public static function groups(): array
    {
        $groups = ['project' => [], 'issue' => [], 'bug' => []];

        foreach (self::tasks() as $task) {
            $groups[$task['category']][] = $task;
        }

        return $groups;
    }

    /**
     * Same shape as ManifestController::renderDoc(): title, html, date.
     */
    public static function doc(string $pageId): ?array
    {
        $key = array_search($pageId, self::IDS, true);

        if ($key === false) {
            return null;
        }

        return self::userDocs()[$key] ?? null;
    }

    /**
     * Journey milestones for a container/task, shown on top of its document.
     * Dates are derived from the doc's own date so everything stays consistent.
     */
    public static function journey(string $pageId): ?array
    {
        $key = array_search($pageId, self::IDS, true);

        if ($key === false) {
            return null;
        }

        $base = Carbon::parse(self::tasks()[$key]['date']);

        return [
            ['label' => 'Aberto pelo suporte',              'date' => $base->copy()->subDays(12), 'done' => true],
            ['label' => 'Análise do dev',                    'date' => $base->copy()->subDays(8),  'done' => true],
            ['label' => 'Correção aplicada',                 'date' => $base->copy()->subDays(3),  'done' => true],
            ['label' => 'QA aprovado · Concluído',            'date' => $base->copy()->subDay(),    'done' => true],
            ['label' => 'Documentado (document-this)',       'date' => $base->copy(),              'done' => true],
            ['label' => 'Publicado (manifest-it)',           'date' => $base->copy()->addDay(),    'done' => true],
        ];
    }

    /**
     * All vessels (sprints) with their containers (cards), for the Pátio do Porto.
     */
    public static function vessels(): array
    {
        $tasks = self::tasks();
        $vessels = [];

        foreach (self::VESSELS as $key => $meta) {
            $containers = [];

            foreach ($meta['tasks'] as $taskKey) {
                $t = $tasks[$taskKey];
                $containers[] = [
                    'number'   => $t['number'],
                    'title'    => $t['title'],
                    'category' => $t['category'],
                    'doc_id'   => $t['doc_id'],
                    'date'     => $t['date'],
                ];
            }

            // Container fictício sem documentação ainda — dá contexto ao "restante" do donut.
            $containers[] = [
                'number'   => $meta['pending']['number'],
                'title'    => $meta['pending']['title'],
                'category' => 'pending',
                'doc_id'   => null,
                'date'     => null,
            ];

            $vessels[] = [
                'key'        => $key,
                'label'      => $meta['label'],
                'voyage'     => $meta['voyage'],
                'status'     => $meta['status'],
                'period'     => $meta['period'],
                'documented' => count($meta['tasks']),
                'total'      => count($containers),
                'containers' => $containers,
            ];
        }

        return $vessels;
    }

    public static function vessel(string $key): ?array
    {
        foreach (self::vessels() as $vessel) {
            if ($vessel['key'] === $key) {
                return $vessel;
            }
        }

        return null;
    }

    // ── Internal: single source of truth per task ───────────────────────────

    private static function tasks(): array
    {
        $t = fn (string $key, string $category, string $title, string $date, ?string $cardId) => [
            'category' => $category,
            'title'    => $title,
            'number'   => $cardId ? "TBX {$cardId}" : null,
            'doc_id'   => self::IDS[$key],
            'date'     => $date,
        ];

        return [
            'elgin'    => $t('elgin',    'project', 'Módulo de Impressão Térmica — Elgin i9 (Ticket 80mm)',           '2026-06-30T18:06:00.000Z', '2310'),
            'mobile'   => $t('mobile',   'project', 'App Mobile — Consulta de Bookings em tempo real',                 '2026-06-24T14:12:00.000Z', '2287'),
            'bookings' => $t('bookings', 'issue',   'Filtro por período e exportação na tela de Bookings',             '2026-06-27T10:41:00.000Z', '2301'),
            'address'  => $t('address',  'issue',   'Novos campos de endereço em Consignee, Buyer e Seller (SI)',      '2026-06-19T16:05:00.000Z', '2264'),
            'company'  => $t('company',  'bug',     'Campo Company do cadastro voltou a aceitar apenas região Brasil', '2026-07-01T09:22:00.000Z', '2318'),
            'peso'     => $t('peso',     'bug',     'Peso bruto do contêiner arredondado incorretamente no Manifesto', '2026-06-25T11:37:00.000Z', '2293'),
        ];
    }

    // ── User release notes (the only version — the site has no tech-doc area;
    //    technical documentation lives directly in Notion) ─────────────────

    private static function userDocs(): array
    {
        return [
            'elgin' => [
                'title' => '🚀 Módulo de Impressão Térmica — Elgin i9',
                'date'  => '2026-06-30T18:06:00.000Z',
                'html'  => <<<HTML
<h2>O que mudou</h2>
<p>O TABEX agora imprime tickets de pesagem e etiquetas de conferência diretamente em impressoras térmicas Elgin i9 (bobina 80mm), sem precisar gerar PDF e imprimir manualmente.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>Na tela de pesagem, o botão <strong>Imprimir ticket</strong> envia direto para a impressora térmica configurada.</li>
<li>A configuração fica em <strong>Configurações → Impressoras</strong>, uma única vez por estação.</li>
<li>O layout do ticket foi desenhado para 80mm: mais legível e com QR code de rastreio da carga.</li>
</ul>
HTML,
            ],
            'mobile' => [
                'title' => '🚀 App Mobile — Consulta de Bookings',
                'date'  => '2026-06-24T14:12:00.000Z',
                'html'  => <<<HTML
<h2>O que mudou</h2>
<p>Agora é possível acompanhar seus bookings pelo celular: status, janelas de atracação e documentos da carga, em tempo real.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>Consulte qualquer booking pelo número ou pelo nome do navio.</li>
<li>Receba notificações quando o status da carga mudar.</li>
<li>Disponível para Android e iOS — fale com o suporte para liberar seu acesso.</li>
</ul>
HTML,
            ],
            'bookings' => [
                'title' => '✨ Filtro por período e exportação na tela de Bookings',
                'date'  => '2026-06-27T10:41:00.000Z',
                'html'  => <<<HTML
<h2>O que mudou</h2>
<p>A tela de Bookings ganhou filtro por período (data de embarque) e um botão para exportar o resultado filtrado em planilha.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>Encontre rapidamente os bookings de uma semana ou mês específico.</li>
<li>Exporte exatamente o que está na tela — sem precisar pedir relatórios ao suporte.</li>
<li>O botão <strong>Limpar filtros</strong> restaura a visão completa com um clique.</li>
</ul>
HTML,
            ],
            'address' => [
                'title' => '✨ Novos campos de endereço em Consignee, Buyer e Seller',
                'date'  => '2026-06-19T16:05:00.000Z',
                'html'  => <<<HTML
<h2>O que mudou</h2>
<p>Os cadastros de Consignee, Buyer e Seller da SI agora têm campos separados para rua, número, complemento, cidade, estado e país.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>Os documentos gerados saem com o endereço formatado corretamente, no padrão exigido pelos armadores.</li>
<li>Endereços antigos foram migrados automaticamente — não é preciso redigitar nada.</li>
</ul>
HTML,
            ],
            'company' => [
                'title' => '🐞 Campo Company do cadastro voltou a aceitar apenas região Brasil',
                'date'  => '2026-07-01T09:22:00.000Z',
                'html'  => <<<HTML
<h2>O que foi corrigido</h2>
<p>Na tela de cadastro (sign up), o campo <strong>Company</strong> estava listando empresas de todas as regiões do mundo, quando deveria mostrar apenas empresas da região Brasil. Isso causava cadastros vinculados à empresa errada.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>O campo agora lista somente empresas da região Brasil, como era o esperado.</li>
<li>Cadastros feitos no período com empresa incorreta foram revisados pelo suporte.</li>
</ul>
HTML,
            ],
            'peso' => [
                'title' => '🐞 Peso bruto do contêiner arredondado incorretamente no Manifesto',
                'date'  => '2026-06-25T11:37:00.000Z',
                'html'  => <<<HTML
<h2>O que foi corrigido</h2>
<p>Em manifestos com carga fracionada, o peso bruto do contêiner era arredondado para o inteiro mais próximo, gerando divergência entre o manifesto e a pesagem real.</p>
<h2>Como isso te afeta</h2>
<ul>
<li>O peso bruto agora é exibido com 3 casas decimais em todos os documentos.</li>
<li>Manifestos emitidos anteriormente não são alterados — em caso de divergência, fale com o suporte.</li>
</ul>
HTML,
            ],
        ];
    }
}
