'use client';

/**
 * Dashboard do programa "Produto de software" — portfolio agregado + resumo financeiro/cronograma.
 *
 * @route /projetos/[id]/produto/dashboard
 */

import { Calendar, Coins, FileUp } from 'lucide-react';
import Link from 'next/link';
import React, { useMemo, useState } from 'react';
import { useParams } from 'next/navigation';
import { Alert, Button, Col, Row, Space, Tag, Tooltip, Typography } from 'antd';
import ProjetoLayout from '@/components/layouts/ProjetoLayout';
import ContentCard from '@/components/layouts/ContentCard';
import MetricCard from '@/components/layouts/MetricCard';
import MetricsGrid from '@/components/layouts/MetricsGrid';
import { ICON_SIZE_MD } from '@/components/icons';
import { useQueryCache } from '@/hooks/useQueryCache';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { queryKeys } from '@/lib/cache/queryKeys';
import {
    normalizarProjetoResponse,
    type ProjetoShowApiResponse,
} from '@/features/projetos/utils/normalizeProjetoShowResponse';
import {
    ProjetoPortfolioPanel,
    type ProjetoPortfolioData,
} from '@/features/projetos/projeto-portfolio/ProjetoPortfolioPanel';
import {
    projetoPortfolioQueryKey,
    projetoProdutoMetaQueryKey,
} from '@/features/projetos/projeto-produto-releases/utils/produtoQueryKeys';
import { portfolioTruncadoBanner } from '@/features/projetos/projeto-portfolio/utils/portfolioTruncadoCopy';
import { ProdutoSoftwareTipoFetchErrorAlert } from '@/features/projetos/components/ProdutoSoftwareTipoFetchErrorAlert';
import {
    CPI_SPI_GLOSSARIO_COPY,
    CpiSpiGlossarioHelp,
    FORMULA_CPI_SPI_VERSION,
} from '@/features/projetos/projeto-produto-releases/utils/cpiSpiGlossario';
import {
    ProdutoReleaseAlertasBanner,
    useProdutoReleaseAlertasInApp,
} from '@/features/projetos/produto-alertas';
import { ProdutoImportCsvModal } from '@/features/projetos/produto-importacao-csv';
import { useProjetoWriteGates } from '@/features/projetos/hooks/useProjetoWriteGates';
import { ProdutoDiagnosticoHealthCard } from './components/ProdutoDiagnosticoHealthCard';
import { ProdutoIntegracoesInventarioCard } from './components/ProdutoIntegracoesInventarioCard';
import { ReleaseActualCard } from './components/ReleaseActualCard';

const { Text } = Typography;

type PortfolioResponse = { data: ProjetoPortfolioData };

const CICLO_VIDA_LABEL: Record<string, string> = {
    discovery: 'Discovery',
    alpha: 'Alpha',
    beta: 'Beta',
    ga: 'GA',
    sunset: 'Sunset',
};

export function ProjetoProdutoDashboardScreen() {
    const params = useParams();
    const projetoId = params?.id as string;
    const [importOpen, setImportOpen] = useState(false);
    const { canCriar, permsLoading, tooltipSemPermissao } = useProjetoWriteGates();
    const { atrasadas, bloqueado } = useProdutoReleaseAlertasInApp(projetoId);

    const {
        data: projetoRaw,
        isError: errorProjeto,
        error: projetoError,
        refetch: refetchProjeto,
    } = useQueryCache<ProjetoShowApiResponse>({
        queryKey: queryKeys.projetos.detail(projetoId),
        endpoint: API_ENDPOINTS.projetos.show(projetoId),
        enabled: Boolean(projetoId),
        staleTime: 5 * 60 * 1000,
    });

    const {
        data: portfolioRaw,
        isError: errorPortfolio,
        error: portfolioError,
        refetch: refetchPortfolio,
    } = useQueryCache<PortfolioResponse>({
        queryKey: projetoPortfolioQueryKey(projetoId),
        endpoint: API_ENDPOINTS.projetos.portfolio(projetoId),
        enabled: Boolean(projetoId),
        staleTime: 2 * 60 * 1000,
    });

    const {
        data: produtoRaw,
        isError: errorProduto,
        error: produtoError,
        refetch: refetchProduto,
    } = useQueryCache<{
        data: { ciclo_vida?: string; subprojetos_count?: number };
    }>({
        queryKey: projetoProdutoMetaQueryKey(projetoId),
        endpoint: API_ENDPOINTS.projetos.produto.show(projetoId),
        enabled: Boolean(projetoId),
        staleTime: 2 * 60 * 1000,
    });

    const projeto = useMemo(() => normalizarProjetoResponse(projetoRaw), [projetoRaw]);
    const portfolio = portfolioRaw?.data;
    const financeiro = portfolio?.financeiro_agregado;
    const cronograma = portfolio?.cronograma_agregado;
    const cicloVida = produtoRaw?.data?.ciclo_vida;
    const subprojetosCount =
        produtoRaw?.data?.subprojetos_count ?? portfolio?.meta?.total_subprojetos ?? 0;

    const semSuperficies = subprojetosCount === 0;
    const truncadoBanner = portfolioTruncadoBanner(portfolio?.meta);
    const fetchError =
        (errorProduto && produtoError) ||
        (errorPortfolio && portfolioError) ||
        (errorProjeto && projetoError) ||
        null;

    const handleRetry = () => {
        void refetchProjeto();
        void refetchPortfolio();
        void refetchProduto();
    };

    const importCta = permsLoading || canCriar ? (
        <Button
            icon={<FileUp size={16} aria-hidden />}
            onClick={() => setImportOpen(true)}
            loading={permsLoading}
            data-testid="produto-dashboard-import-csv"
        >
            Importar CSV
        </Button>
    ) : (
        <Tooltip title={tooltipSemPermissao('importar programas e superfícies via CSV')}>
            <span>
                <Button
                    icon={<FileUp size={16} aria-hidden />}
                    disabled
                    data-testid="produto-dashboard-import-csv-disabled"
                >
                    Importar CSV
                </Button>
            </span>
        </Tooltip>
    );

    return (
        <ProjetoLayout
            projetoId={projetoId}
            pageTitle="Dashboard do produto"
            titleSection="Produto de software — dashboard"
            headerAction={importCta}
        >
            {fetchError ? (
                <div style={{ marginBottom: 16 }}>
                    <ProdutoSoftwareTipoFetchErrorAlert
                        error={fetchError}
                        fallbackMessage="Não foi possível carregar o dashboard do produto"
                        onRetry={handleRetry}
                    />
                </div>
            ) : null}

            <ProdutoReleaseAlertasBanner
                projetoId={projetoId}
                atrasadas={atrasadas}
                bloqueado={bloqueado}
            />

            {semSuperficies && !fetchError ? (
                <Alert
                    type="info"
                    showIcon
                    style={{ marginBottom: 16 }}
                    data-testid="produto-dashboard-empty-superficies"
                    message="Comece o programa tipológico"
                    description={
                        canCriar || permsLoading
                            ? 'Ainda não há superfícies (subprojetos). Adicione a primeira ou abra a área tipológica de software para documentar escopo e inventário.'
                            : 'Este programa ainda não tem superfícies. Quem tiver permissão de criar projetos pode adicionar o primeiro subprojeto. A área tipológica de software permanece disponível para leitura e documentação.'
                    }
                    action={
                        <Space wrap>
                            <Link href={`/projetos/${projetoId}/software`}>
                                <Button size="small" data-testid="produto-dashboard-software-hub">
                                    Área tipológica
                                </Button>
                            </Link>
                            <Link href={`/projetos/${projetoId}/produto/onboarding`}>
                                <Button size="small">Ver onboarding</Button>
                            </Link>
                            {permsLoading || canCriar ? (
                                <Link
                                    href={`/projetos/create?projeto_pai_id=${encodeURIComponent(projetoId)}`}
                                >
                                    <Button
                                        type="primary"
                                        size="small"
                                        loading={permsLoading}
                                        data-testid="produto-dashboard-novo-subprojeto"
                                    >
                                        Novo subprojeto
                                    </Button>
                                </Link>
                            ) : (
                                <Tooltip title={tooltipSemPermissao('criar subprojetos')}>
                                    <span>
                                        <Button
                                            type="primary"
                                            size="small"
                                            disabled
                                            data-testid="produto-dashboard-novo-subprojeto-disabled"
                                        >
                                            Novo subprojeto
                                        </Button>
                                    </span>
                                </Tooltip>
                            )}
                        </Space>
                    }
                />
            ) : null}

            <ProdutoDiagnosticoHealthCard projetoId={projetoId} />

            <ProdutoIntegracoesInventarioCard projetoId={projetoId} />

            <Alert
                type="info"
                showIcon
                style={{ marginBottom: 16 }}
                message={`${CPI_SPI_GLOSSARIO_COPY.aviso} · fórmula ${FORMULA_CPI_SPI_VERSION}`}
                description="No financeiro do produto, CPI/SPI do rollup Waygest não equivalem a EVM canónico (PMI)."
                action={
                    <Space wrap>
                        <CpiSpiGlossarioHelp />
                        <Link href={`/projetos/${projetoId}/produto/financeiro`}>
                            <Button size="small">Ver financeiro</Button>
                        </Link>
                    </Space>
                }
                data-testid="dashboard-cpi-spi-glossario"
            />

            <Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
                <Col xs={24} md={8}>
                    <ContentCard title="Ciclo de vida">
                        {cicloVida ? (
                            <Tag color="blue">{CICLO_VIDA_LABEL[cicloVida] ?? cicloVida}</Tag>
                        ) : (
                            <Text type="secondary">—</Text>
                        )}
                    </ContentCard>
                </Col>
                <Col xs={24} md={8}>
                    <ReleaseActualCard projetoId={projetoId} />
                </Col>
                <Col xs={24} md={8}>
                    <MetricsGrid columns={1}>
                        <MetricCard
                            icon={<Coins size={ICON_SIZE_MD} aria-hidden />}
                            label="Orçamento (programa + superfícies)"
                            value={
                                financeiro?.orcamento_total != null
                                    ? financeiro.orcamento_total.toLocaleString('pt-PT', {
                                          style: 'currency',
                                          currency: 'EUR',
                                      })
                                    : '—'
                            }
                            variant="financeiro"
                        />
                        <MetricCard
                            icon={<Calendar size={ICON_SIZE_MD} aria-hidden />}
                            label="Cronograma master"
                            value={
                                cronograma?.data_inicio_min && cronograma?.data_fim_prevista_max
                                    ? `${cronograma.data_inicio_min} → ${cronograma.data_fim_prevista_max}`
                                    : '—'
                            }
                            variant="projetos"
                        />
                    </MetricsGrid>
                </Col>
            </Row>

            <ProjetoPortfolioPanel projetoId={projetoId} programaNome={projeto?.nome} />

            <ProdutoImportCsvModal
                open={importOpen}
                onClose={() => setImportOpen(false)}
                onSuccess={() => {
                    void refetchProjeto();
                    void refetchPortfolio();
                    void refetchProduto();
                }}
            />
        </ProjetoLayout>
    );
}
