'use client';

import React, { useMemo } from 'react';
import { Copy, Download, Globe, Link2, TriangleAlert } from 'lucide-react';
import { Alert, Button, Collapse, Space, Table, Typography } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { ICON_SIZE_MD } from '@/components/icons';
import ContentCard from '@/components/layouts/ContentCard';
import MetricCard from '@/components/layouts/MetricCard';
import MetricsGrid from '@/components/layouts/MetricsGrid';
import { message } from '@/lib/feedback/message';
import type { SitemapCrawlError, SitemapCrawlResult } from '../types';
import { copySitemapXml, downloadSitemapXml } from '../utils/sitemapXml';

const { Text, Paragraph } = Typography;

export interface SitemapCrawlerReportProps {
    result: SitemapCrawlResult;
    showUrlHeader?: boolean;
}

export function SitemapCrawlerReport({ result, showUrlHeader = true }: SitemapCrawlerReportProps) {
    const urlColumns: ColumnsType<{ key: number; url: string }> = useMemo(
        () => [
            {
                title: '#',
                dataIndex: 'key',
                width: 60,
                render: (v: number) => v + 1,
            },
            {
                title: 'URL',
                dataIndex: 'url',
                ellipsis: true,
            },
        ],
        [],
    );

    const errorColumns: ColumnsType<SitemapCrawlError> = useMemo(
        () => [
            { title: 'URL', dataIndex: 'url', ellipsis: true },
            { title: 'Erro', dataIndex: 'message', ellipsis: true },
        ],
        [],
    );

    const urlDataSource = useMemo(
        () => (result.urls ?? []).map((url, index) => ({ key: index, url })),
        [result.urls],
    );

    const hasErrors = (result.errors ?? []).length > 0;
    const hasUrls = (result.total_urls ?? 0) > 0;

    const handleCopy = async () => {
        const ok = await copySitemapXml(result.sitemap_xml ?? '');
        if (ok) {
            message.success('XML copiado para a área de transferência!');
        } else {
            message.error('Não foi possível copiar o XML.');
        }
    };

    const handleDownload = () => {
        if (!result.sitemap_xml) {
            message.warning('Nenhum XML disponível para download.');
            return;
        }
        downloadSitemapXml(result.sitemap_xml);
        message.success('Download iniciado.');
    };

    return (
        <div data-testid="sitemap-metrics">
            {showUrlHeader ? (
                <Alert
                    type="info"
                    showIcon
                    message={
                        <Space>
                            <Globe size={ICON_SIZE_MD} aria-hidden />
                            <Text>
                                Site analisado: <Text strong>{result.url}</Text>
                            </Text>
                        </Space>
                    }
                    style={{ marginBottom: 24 }}
                />
            ) : null}

            <MetricsGrid style={{ marginBottom: 24 }}>
                <MetricCard
                    label="URLs encontradas"
                    value={result.total_urls ?? 0}
                    icon={<Link2 size={ICON_SIZE_MD} aria-hidden />}
                    variant={hasUrls ? 'concluidos' : 'projetos'}
                />
                <MetricCard
                    label="URLs com erro"
                    value={(result.errors ?? []).length}
                    icon={<TriangleAlert size={ICON_SIZE_MD} aria-hidden />}
                    variant={hasErrors ? 'emAndamento' : 'concluidos'}
                />
                <MetricCard
                    label="Profundidade máx."
                    value={result.max_depth ?? '—'}
                    icon={<Globe size={ICON_SIZE_MD} aria-hidden />}
                    variant="projetos"
                />
                <MetricCard
                    label="Limite de URLs"
                    value={result.max_urls ?? '—'}
                    icon={<Link2 size={ICON_SIZE_MD} aria-hidden />}
                    variant="projetos"
                />
            </MetricsGrid>

            {hasUrls ? (
                <ContentCard title="URLs encontradas" style={{ marginBottom: 24 }}>
                    <Table
                        data-testid="sitemap-urls-table"
                        size="small"
                        rowKey="key"
                        dataSource={urlDataSource}
                        columns={urlColumns}
                        pagination={{ pageSize: 15, showSizeChanger: true }}
                        scroll={{ x: true }}
                    />
                </ContentCard>
            ) : (
                <ContentCard style={{ marginBottom: 24 }}>
                    <Text type="secondary">Nenhuma URL interna foi encontrada neste site.</Text>
                </ContentCard>
            )}

            {hasErrors ? (
                <ContentCard title="URLs com erro" style={{ marginBottom: 24 }}>
                    <Table
                        size="small"
                        rowKey={(row: any) => `${row.url}-${row.message}`}
                        dataSource={result.errors}
                        columns={errorColumns}
                        pagination={{ pageSize: 8 }}
                        scroll={{ x: true }}
                    />
                </ContentCard>
            ) : null}

            {result.sitemap_xml ? (
                <ContentCard
                    title="sitemap.xml"
                    extra={
                        <Space>
                            <Button
                                data-testid="sitemap-copy-xml"
                                icon={<Copy size={ICON_SIZE_MD} aria-hidden />}
                                onClick={() => void handleCopy()}
                            >
                                Copiar XML
                            </Button>
                            <Button
                                data-testid="sitemap-download-xml"
                                type="primary"
                                icon={<Download size={ICON_SIZE_MD} aria-hidden />}
                                onClick={handleDownload}
                            >
                                Baixar sitemap.xml
                            </Button>
                        </Space>
                    }
                >
                    <Collapse
                        data-testid="sitemap-xml-preview"
                        items={[
                            {
                                key: 'xml',
                                label: 'Pré-visualizar XML gerado',
                                children: (
                                    <Paragraph
                                        code
                                        copyable={{ text: result.sitemap_xml }}
                                        style={{
                                            maxHeight: 320,
                                            overflow: 'auto',
                                            whiteSpace: 'pre-wrap',
                                            wordBreak: 'break-all',
                                            marginBottom: 0,
                                        }}
                                    >
                                        {result.sitemap_xml}
                                    </Paragraph>
                                ),
                            },
                        ]}
                    />
                </ContentCard>
            ) : null}
        </div>
    );
}
