'use client';

import { useState } from 'react';
import { Alert, Button, Space, Typography } from 'antd';
import { message } from '@/lib/feedback/message';
import { confirmDialog } from '@/lib/feedback/confirmDialog';
import { useMutationCache } from '@/hooks/useMutationCache';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { getLaravelApiErrorMessage } from '@/lib/api/laravelApiErrorMessage';
import ContentCard from '@/components/layouts/ContentCard';
import type { BridgePropostaOrcamentoResponse } from '../bridgeOrcamentoContract';

const { Text } = Typography;

export type PropostaBridgeOrcamentoCardProps = {
    propostaId: number;
    /** @deprecated API bridge não exige negocio_id no body — mantido para contexto UI. */
    negocioId?: number | null;
    /** @deprecated API bridge não exige projeto_id no body — mantido para contexto UI. */
    projetoId?: number | null;
    /** Proposta já enviada — orçamento não deve alterar a oferta. */
    propostaEnviada?: boolean;
    disabled?: boolean;
};

/**
 * Bridge Proposta → Orçamento (ADR-0091). POST `gerar-orcamento`.
 */
export function PropostaBridgeOrcamentoCard({
    propostaId,
    propostaEnviada = false,
    disabled = false,
}: PropostaBridgeOrcamentoCardProps) {
    const [lastResult, setLastResult] = useState<BridgePropostaOrcamentoResponse | null>(null);

    const mutation = useMutationCache<
        BridgePropostaOrcamentoResponse,
        { forcar_novo?: boolean }
    >({
        endpoint: API_ENDPOINTS.vendas.propostas.gerarOrcamento(propostaId),
        method: 'POST',
        onSuccess: (data) => {
            const orcamentoId = data?.data?.id ?? data?.orcamento_id;
            setLastResult({
                ...data,
                orcamento_id: typeof orcamentoId === 'number' ? orcamentoId : data?.orcamento_id,
                proposta_id: propostaId,
            });
            message.success(data?.message ?? 'Orçamento gerado a partir da proposta.');
        },
        onError: (err: unknown) => {
            const status =
                err && typeof err === 'object' && 'response' in err
                    ? (err as { response?: { status?: number } }).response?.status
                    : undefined;
            if (status === 404 || status === 501) {
                message.warning(
                    'A bridge Proposta→Orçamento ainda não está disponível neste ambiente.',
                );
                return;
            }
            message.error(
                getLaravelApiErrorMessage(err, 'Não foi possível gerar o orçamento a partir da proposta.'),
            );
        },
    });

    const handleGerar = () => {
        confirmDialog({
            title: 'Gerar orçamento a partir da proposta',
            content: propostaEnviada
                ? 'Será criado/atualizado um orçamento financeiro vinculado. Alterações no orçamento não alteram a oferta comercial já enviada.'
                : 'Será criado/atualizado um orçamento financeiro com os valores desta proposta (ADR-0076: Proposta ≠ Orçamento).',
            okText: 'Gerar orçamento',
            cancelText: 'Cancelar',
            onOk: () => mutation.mutate({}),
        });
    };

    const orcamentoIdExibido = lastResult?.orcamento_id ?? lastResult?.data?.id;

    return (
        <ContentCard title="Orçamento financeiro" data-testid="crm-proposta-bridge-orcamento">
            <Space direction="vertical" size="middle" style={{ width: '100%' }}>
                <Text type="secondary" style={{ fontSize: 13 }}>
                    Gera ou atualiza o orçamento a partir desta proposta, sem misturar modelos
                    (ADR-0076 / ADR-0091).
                </Text>
                {propostaEnviada ? (
                    <Alert
                        type="info"
                        showIcon
                        message="Proposta já enviada"
                        description="O orçamento pode divergir para fins financeiros; a oferta comercial permanece no snapshot."
                    />
                ) : null}
                <Button
                    type="default"
                    onClick={handleGerar}
                    loading={mutation.isPending}
                    disabled={disabled}
                    data-testid="crm-proposta-bridge-orcamento-btn"
                >
                    Gerar orçamento da proposta
                </Button>
                {orcamentoIdExibido ? (
                    <Text data-testid="crm-proposta-bridge-orcamento-resultado">
                        Orçamento #{orcamentoIdExibido} vinculado.
                    </Text>
                ) : null}
            </Space>
        </ContentCard>
    );
}
