'use client';

/**
 * Painel S2.1 do passo Logs — ZIP Logs Package, 3 artefactos, token e prova.
 * Não expõe clone GitLab ao cliente.
 */

import { useCallback, useMemo, useState } from 'react';
import { Alert, Button, Space, Typography } from 'antd';
import { Download, RefreshCw } from 'lucide-react';

import { ICON_SIZE_SM } from '@/components/icons';
import { ProjetoIngestTokenSection } from '@/features/projetos/projeto-observabilidade-logs';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { getApiBaseUrlOrNull } from '@/lib/env/runtime';
import { message } from '@/lib/feedback/message';

import { downloadConectarArtefacto } from './downloadConectarArtefacto';
import type { ConectarPassoDto } from './types';

const { Text, Paragraph } = Typography;

type Props = {
    projetoId: string;
    passo: ConectarPassoDto;
    onAtualizarStatus: () => Promise<unknown>;
};

function apiBaseForLogsPackage(): string {
    const raw = getApiBaseUrlOrNull() ?? '';
    const trimmed = raw.replace(/\/api\/?$/i, '').replace(/\/$/, '');
    return trimmed || 'https://api.seudominio.com.br';
}

export function ConectarLogsPassoPanel({ projetoId, passo, onAtualizarStatus }: Props) {
    const [checking, setChecking] = useState(false);
    const [downloading, setDownloading] = useState(false);
    const downloadLink =
        typeof passo.links.logs_package_download === 'string' &&
        passo.links.logs_package_download.trim() !== ''
            ? passo.links.logs_package_download.trim()
            : null;
    const useApiDownload = downloadLink === 'api:logs-package';
    const externalUrl = useApiDownload ? null : downloadLink;

    const tokenPrefix =
        typeof passo.sinais.token_prefix === 'string' ? passo.sinais.token_prefix : null;
    const logsTotal =
        typeof passo.sinais.logs_total === 'number' ? passo.sinais.logs_total : null;
    const tokenOk = passo.sinais.ingest_token_configurado === true;

    const snippet = useMemo(() => {
        const base = apiBaseForLogsPackage();
        return `<?php\nreturn [\n    'api_base_url' => '${base}',\n    'project_token' => 'COLE_O_TOKEN_AQUI',\n    // demais chaves: copiar de config.example.php\n];\n`;
    }, []);

    const copySnippet = useCallback(async () => {
        try {
            await navigator.clipboard.writeText(snippet);
            message.success('Snippet copiado. Cole em config.local.php e substitua o token.');
        } catch {
            message.error('Não foi possível copiar. Selecione o texto e copie manualmente.');
        }
    }, [snippet]);

    const handleDownloadZip = useCallback(async () => {
        if (externalUrl) {
            window.open(externalUrl, '_blank', 'noopener,noreferrer');
            return;
        }
        if (!useApiDownload) return;
        setDownloading(true);
        try {
            await downloadConectarArtefacto(
                API_ENDPOINTS.projetos.conectarLogsPackage(projetoId),
                'logs-package-v0.1.0.zip',
            );
            message.success('Download do Logs Package iniciado.');
        } catch (e: unknown) {
            message.error(e instanceof Error ? e.message : 'Falha ao baixar o ZIP.');
        } finally {
            setDownloading(false);
        }
    }, [externalUrl, useApiDownload, projetoId]);

    const handleProva = useCallback(async () => {
        setChecking(true);
        try {
            await onAtualizarStatus();
            message.info(
                'Status atualizado. Se o shipper já enviou um evento, o passo conclui sozinho.',
            );
        } catch {
            message.error('Não foi possível atualizar o status da conexão.');
        } finally {
            setChecking(false);
        }
    }, [onAtualizarStatus]);

    return (
        <Space direction="vertical" size="middle" style={{ width: '100%' }}>
            <Alert
                type="info"
                showIcon
                message="Logs Package (legado PHP)"
                description={
                    <ol style={{ margin: '8px 0 0', paddingLeft: 18 }}>
                        <li>
                            <Text strong>Include</Text> — no <Text code>index.php</Text> do legado:{' '}
                            <Text code>
                                require_once …/logs-package/src/bootstrap.php;
                            </Text>
                        </li>
                        <li>
                            <Text strong>Config</Text> — copie <Text code>config.example.php</Text> para{' '}
                            <Text code>config.local.php</Text> (só no servidor; nunca no Git).
                        </li>
                        <li>
                            <Text strong>Cron</Text> — agende{' '}
                            <Text code>php bin/ship-logs.php</Text> (ex.: a cada 5 min; ver{' '}
                            <Text code>examples/crontab.example</Text>).
                        </li>
                    </ol>
                }
            />

            <Space wrap>
                {useApiDownload || externalUrl ? (
                    <Button
                        type="primary"
                        icon={<Download size={ICON_SIZE_SM} />}
                        loading={downloading}
                        onClick={() => void handleDownloadZip()}
                    >
                        Baixar Logs Package (ZIP)
                    </Button>
                ) : (
                    <Button type="primary" disabled title="Pacote indisponível neste ambiente">
                        Baixar Logs Package (indisponível)
                    </Button>
                )}
            </Space>

            {!useApiDownload && !externalUrl ? (
                <Text type="secondary">
                    O ZIP não está publicado neste ambiente. Contate a equipe Waygest.
                </Text>
            ) : null}

            <div>
                <Text strong>Valores para config.local.php</Text>
                <Paragraph type="secondary" style={{ marginBottom: 8, marginTop: 4 }}>
                    Prefixo do token (mascarado):{' '}
                    {tokenPrefix ? <Text code>{tokenPrefix}…</Text> : 'ainda não configurado'}. Gere
                    ou rotacione abaixo e cole o plaintext em{' '}
                    <Text code>project_token</Text>.
                </Paragraph>
                <Paragraph>
                    <pre
                        style={{
                            margin: 0,
                            padding: 12,
                            background: 'var(--gray-100)',
                            borderRadius: 8,
                            fontSize: 12,
                            overflow: 'auto',
                        }}
                    >
                        {snippet}
                    </pre>
                </Paragraph>
                <Button size="small" onClick={() => void copySnippet()}>
                    Copiar snippet
                </Button>
            </div>

            <ProjetoIngestTokenSection projetoId={projetoId} />

            <Alert
                type={passo.status === 'concluido' ? 'success' : 'warning'}
                showIcon
                message={
                    passo.status === 'concluido'
                        ? 'Evento(s) recebidos — passo concluído automaticamente'
                        : 'Enviar log de prova'
                }
                description={
                    passo.status === 'concluido' ? (
                        <Text>
                            Token ativo e {logsTotal ?? '≥1'} evento(s) no projeto. Retenção LGPD
                            controlada pelas env <Text code>WAYGEST_PROJETO_LOGS_*</Text> na API.
                        </Text>
                    ) : (
                        <Space direction="vertical" size="small">
                            <Text>
                                No servidor legado: gere um evento (
                                <Text code>php examples/index.php</Text> ou tráfego real) e rode{' '}
                                <Text code>php bin/ship-logs.php</Text>. Depois atualize o status
                                aqui.
                            </Text>
                            <Text type="secondary">
                                Conclusão automática exige token configurado
                                {tokenOk ? ' (OK)' : ' (pendente)'} e pelo menos um log vinculado a
                                este projeto
                                {logsTotal != null ? ` (hoje: ${logsTotal})` : ''}.
                            </Text>
                            <Button
                                icon={<RefreshCw size={ICON_SIZE_SM} />}
                                loading={checking}
                                onClick={() => void handleProva()}
                            >
                                Atualizar status após shipper
                            </Button>
                        </Space>
                    )
                }
            />
        </Space>
    );
}
