'use client';

/**
 * @route /projetos/[id]/planejamento/financeiro/viabilidade
 */

import { BarChart3, CheckCircle2, CircleDollarSign, Clock, Percent } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React from 'react';
import { useParams, useRouter } from 'next/navigation';
import { Button, Table, Tag, Alert, Typography, Space } from 'antd';
import { useQueryCache } from '@/hooks/useQueryCache';
import { queryKeys } from '@/lib/cache/queryKeys';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { formatCurrency } from '@/lib/utils/export';
import type { ColumnsType } from 'antd/es/table';
import ProjetoLayout from '@/components/layouts/ProjetoLayout';
import MetricsGrid from '@/components/layouts/MetricsGrid';
import MetricCard from '@/components/layouts/MetricCard';
import ContentCard from '@/components/layouts/ContentCard';
import { OperativeRouteHint } from '@/components/layouts/OperativeRouteHint/OperativeRouteHint';

interface ViabilidadeItem {
    indicador: string;
    valor: number;
    classificacao: 'viavel' | 'viavel_com_reservas' | 'inviavel';
    descricao?: string;
}

export default function ProjetoViabilidadePage() {
    const params = useParams();
    const router = useRouter();
    const projetoId = (params?.id as string) || '';

    const {
        data: viabilidadeData,
        isLoading,
        isError,
        error,
        refetch,
    } = useQueryCache<{
        indicadores: ViabilidadeItem[];
        resumo: {
            vpl?: number;
            vir?: number;
            tir?: number;
            payback?: number;
            classificacao_geral: string;
        };
    }>({
        queryKey: queryKeys.projetos.viabilidade(projetoId),
        endpoint: API_ENDPOINTS.projetos.viabilidade(projetoId),
        staleTime: 5 * 60 * 1000,
        gcTime: 10 * 60 * 1000,
        enabled: !!projetoId,
    });

    const indicadores = viabilidadeData?.indicadores || [];
    const resumo: {
        vpl?: number;
        vir?: number;
        tir?: number;
        payback?: number;
        classificacao_geral?: string;
    } = viabilidadeData?.resumo || {};

    const getClassificacaoColor = (classificacao: string) => {
        const colors: Record<string, string> = {
            viavel: 'success',
            viavel_com_reservas: 'warning',
            inviavel: 'error',
        };
        return colors[classificacao] || 'default';
    };

    const getClassificacaoLabel = (classificacao: string) => {
        const labels: Record<string, string> = {
            viavel: 'Viável',
            viavel_com_reservas: 'Viável com reservas',
            inviavel: 'Inviável',
        };
        return labels[classificacao] || classificacao;
    };

    const columns: ColumnsType<ViabilidadeItem> = [
        {
            title: 'Indicador',
            dataIndex: 'indicador',
            key: 'indicador',
            sorter: (a, b) =>
                String(a.indicador ?? '').localeCompare(String(b.indicador ?? ''), 'pt'),
            render: (indicador: string) => <strong>{indicador}</strong>,
        },
        {
            title: 'Valor',
            dataIndex: 'valor',
            key: 'valor',
            sorter: (a, b) => (a.valor ?? 0) - (b.valor ?? 0),
            render: (valor: number, record: ViabilidadeItem) => {
                if (record.indicador.includes('VPL') || record.indicador.includes('Custo')) {
                    return formatCurrency(valor);
                }
                if (record.indicador.includes('%') || record.indicador.includes('TIR')) {
                    return `${valor.toFixed(2)}%`;
                }
                return valor.toLocaleString('pt-BR');
            },
            align: 'right',
        },
        {
            title: 'Classificação',
            dataIndex: 'classificacao',
            key: 'classificacao',
            sorter: (a, b) =>
                String(a.classificacao ?? '').localeCompare(String(b.classificacao ?? ''), 'pt'),
            render: (classificacao: string) => (
                <Tag color={getClassificacaoColor(classificacao)}>
                    {getClassificacaoLabel(classificacao)}
                </Tag>
            ),
        },
        {
            title: 'Descrição',
            dataIndex: 'descricao',
            key: 'descricao',
            ellipsis: true,
            sorter: (a, b) =>
                String(a.descricao ?? '').localeCompare(String(b.descricao ?? ''), 'pt'),
            render: (descricao?: string) => descricao || '—',
        },
    ];

    const classificacaoColor = getClassificacaoColor(resumo.classificacao_geral || '');
    const classificacaoVariant =
        classificacaoColor === 'success'
            ? 'concluidos'
            : classificacaoColor === 'warning'
              ? 'emAndamento'
              : 'planejamento';

    const errorMessage =
        (error as { message?: string } | null)?.message ||
        'Não foi possível carregar a análise de viabilidade. Tente novamente em instantes.';

    return (
        <ProjetoLayout
            projetoId={projetoId}
            pageTitle="Análise de Viabilidade"
            showPageTitleIcon={false}
            titleSection="Análise de Viabilidade"
            breadcrumbItems={[
                { title: 'PROJETO', path: `/projetos/${projetoId}` },
                { title: 'Planejamento' },
                { title: 'Financeiro' },
                { title: 'Viabilidade' },
            ]}
        >
            {isLoading && !viabilidadeData ? (
                <ContentCard>
                    <div style={{ textAlign: 'center', padding: 48 }}>
                        <Typography.Text type="secondary">
                            Carregando análise de viabilidade…
                        </Typography.Text>
                    </div>
                </ContentCard>
            ) : null}

            {isError ? (
                <Alert
                    message="Erro ao carregar análise de viabilidade"
                    description={errorMessage}
                    type="error"
                    showIcon
                    action={
                        <Space wrap>
                            <Button size="small" type="primary" onClick={() => void refetch()}>
                                Tentar novamente
                            </Button>
                            <Button
                                size="small"
                                onClick={() => router.push(`/projetos/${projetoId}`)}
                            >
                                Voltar ao projeto
                            </Button>
                        </Space>
                    }
                    style={{ marginBottom: 16 }}
                />
            ) : null}

            {!isError && viabilidadeData ? (
                <>
                    {resumo.classificacao_geral ? (
                        <OperativeRouteHint
                            type={
                                resumo.classificacao_geral === 'inviavel' ||
                                resumo.classificacao_geral === 'viavel_com_reservas'
                                    ? 'warning'
                                    : 'success'
                            }
                            message="Cenários financeiros e decisão"
                            description={
                                resumo.classificacao_geral === 'inviavel'
                                    ? 'Classificação inviável: revise premissas de custo, receita e prazo antes de comprometer o projeto. Documente mitigações e encaminhe ajustes ao backlog ou orçamento.'
                                    : resumo.classificacao_geral === 'viavel_com_reservas'
                                      ? 'Viável com reservas: identifique quais hipóteses são mais frágeis (payback, TIR, custo) e acompanhe com marcos de revisão.'
                                      : 'Cenário viável nos indicadores apresentados — mantenha monitoramento de desvios e valide premissas em cada fase.'
                            }
                        >
                            <Space wrap>
                                <Button
                                    type="link"
                                    size="small"
                                    onClick={() =>
                                        router.push(
                                            `/projetos/${projetoId}/planejamento/financeiro/precificacao`
                                        )
                                    }
                                >
                                    Precificação
                                </Button>
                                <Button
                                    type="link"
                                    size="small"
                                    onClick={() =>
                                        router.push(`/projetos/${projetoId}/planejamento/backlog`)
                                    }
                                >
                                    Backlog
                                </Button>
                            </Space>
                        </OperativeRouteHint>
                    ) : null}

                    {resumo.classificacao_geral ? (
                        <MetricsGrid columns={5} style={{ marginBottom: 24 }}>
                            <MetricCard
                                icon={<CheckCircle2 size={ICON_SIZE_MD} aria-hidden />}
                                label="Classificação geral"
                                value={getClassificacaoLabel(resumo.classificacao_geral)}
                                variant={classificacaoVariant}
                            />
                            {resumo.vpl !== undefined ? (
                                <MetricCard
                                    icon={<CircleDollarSign size={ICON_SIZE_MD} aria-hidden />}
                                    label="VPL"
                                    value={formatCurrency(resumo.vpl)}
                                    variant={resumo.vpl >= 0 ? 'concluidos' : 'emAndamento'}
                                />
                            ) : null}
                            {resumo.vir !== undefined ? (
                                <MetricCard
                                    icon={<BarChart3 size={ICON_SIZE_MD} aria-hidden />}
                                    label="VIR"
                                    value={resumo.vir.toFixed(2)}
                                    variant={resumo.vir >= 1 ? 'concluidos' : 'emAndamento'}
                                />
                            ) : null}
                            {resumo.tir !== undefined ? (
                                <MetricCard
                                    icon={<Percent size={ICON_SIZE_MD} aria-hidden />}
                                    label="TIR"
                                    value={`${resumo.tir.toFixed(2)}%`}
                                    variant={resumo.tir >= 10 ? 'concluidos' : 'emAndamento'}
                                />
                            ) : null}
                            {resumo.payback !== undefined ? (
                                <MetricCard
                                    icon={<Clock size={ICON_SIZE_MD} aria-hidden />}
                                    label="Payback"
                                    value={`${resumo.payback.toFixed(1)} meses`}
                                    variant="projetos"
                                />
                            ) : null}
                        </MetricsGrid>
                    ) : null}

                    <ContentCard title="Indicadores de viabilidade">
                        <Table
                            columns={columns}
                            dataSource={indicadores}
                            loading={isLoading}
                            rowKey="indicador"
                            pagination={false}
                        />
                    </ContentCard>
                </>
            ) : null}
        </ProjetoLayout>
    );
}
