'use client';

/**
 * Modal contextual do gate UAT no aceite (TASK-PSC-027).
 * Mostra fase/tipo do `contexto` 422 e exige confirmação UAT ou override com motivo.
 */

import React, { useEffect, useState } from 'react';
import { Alert, Button, Form, Input, Modal, Radio, Space, Tag, Typography } from 'antd';
import {
    mergeWaygestFormModalBodyStyles,
    useWaygestFormModalProps,
    waygestFormModalFooterClassName,
} from '@/hooks/useWaygestFormModalProps';
import { useProjetoWriteGates } from '@/features/projetos/hooks/useProjetoWriteGates';
import {
    MOTIVO_OVERRIDE_UAT_MAX,
    MOTIVO_OVERRIDE_UAT_MIN,
    type EntregaAceiteUatContexto,
    rotuloFaseImplantacaoAceite,
    rotuloTipoProjetoAceite,
} from '../utils/entregaAceiteUatGate';
import { getProjetoFaseImplantacaoColor } from '@/features/projetos/pages/ProjetosListPage/projetosListFaseImplantacaoDisplay';

export type ModalAceiteEntregaUatGateModo = 'confirmacao' | 'override';

export type ModalAceiteEntregaUatGateProps = {
    open: boolean;
    contexto: EntregaAceiteUatContexto | null;
    confirmLoading?: boolean;
    onCancel: () => void;
    onConfirmacaoUat: () => void;
    onOverrideUat: (motivo: string) => void;
};

/**
 * Gate de aceite: confirmação UAT (recomendado) ou override auditado com motivo visível.
 */
export function ModalAceiteEntregaUatGate({
    open,
    contexto,
    confirmLoading = false,
    onCancel,
    onConfirmacaoUat,
    onOverrideUat,
}: ModalAceiteEntregaUatGateProps) {
    const formModalLayout = useWaygestFormModalProps();
    const { canOverrideUat } = useProjetoWriteGates();
    const [modo, setModo] = useState<ModalAceiteEntregaUatGateModo>('confirmacao');
    const [motivo, setMotivo] = useState('');
    const [motivoErro, setMotivoErro] = useState<string | null>(null);

    useEffect(() => {
        if (!open) return;
        setModo('confirmacao');
        setMotivo('');
        setMotivoErro(null);
    }, [open]);

    // TASK-PSC-043 / polish 096 — Dev não vê override (API 403)
    useEffect(() => {
        if (!canOverrideUat && modo === 'override') {
            setModo('confirmacao');
        }
    }, [canOverrideUat, modo]);

    const faseLabel = rotuloFaseImplantacaoAceite(contexto?.fase_implantacao);
    const tipoLabel = rotuloTipoProjetoAceite(contexto?.tipo_projeto_codigo);

    const handleSubmit = () => {
        if (modo === 'confirmacao') {
            onConfirmacaoUat();
            return;
        }
        const trimmed = motivo.trim();
        if (trimmed.length < MOTIVO_OVERRIDE_UAT_MIN) {
            setMotivoErro(`Informe pelo menos ${MOTIVO_OVERRIDE_UAT_MIN} caracteres.`);
            return;
        }
        if (trimmed.length > MOTIVO_OVERRIDE_UAT_MAX) {
            setMotivoErro(`Máximo de ${MOTIVO_OVERRIDE_UAT_MAX} caracteres.`);
            return;
        }
        setMotivoErro(null);
        onOverrideUat(trimmed);
    };

    return (
        <Modal
            open={open}
            title="Confirmar aceite com gate UAT"
            onCancel={onCancel}
            confirmLoading={confirmLoading}
            footer={
                <div className={waygestFormModalFooterClassName}>
                    <Button onClick={onCancel} disabled={confirmLoading}>
                        Cancelar
                    </Button>
                    <Button type="primary" loading={confirmLoading} onClick={handleSubmit}>
                        {modo === 'confirmacao' ? 'Confirmar UAT e aceitar' : 'Aceitar com override'}
                    </Button>
                </div>
            }
            width={formModalLayout.width ?? 560}
            centered={formModalLayout.centered ?? true}
            className={formModalLayout.className}
            styles={mergeWaygestFormModalBodyStyles(formModalLayout)}
            zIndex={formModalLayout.zIndex}
            destroyOnHidden
            keyboard
            focusTriggerAfterClose
            data-testid="entrega-aceite-uat-gate-modal"
        >
            <Space direction="vertical" size="middle" style={{ width: '100%' }}>
                <Alert
                    type="warning"
                    showIcon
                    message="Aceite sujeito a validação UAT"
                    description="Neste projeto/fase o aceite não pode ser cego: confirme que a UAT foi concluída, ou registre um override auditado com motivo. Evita faturamento ou go-live prematuros."
                />

                <Space wrap size={[8, 8]} aria-label="Contexto do gate UAT">
                    <Typography.Text type="secondary">Fase:</Typography.Text>
                    <Tag color={getProjetoFaseImplantacaoColor(contexto?.fase_implantacao)}>{faseLabel}</Tag>
                    <Typography.Text type="secondary">Tipo de projeto:</Typography.Text>
                    <Tag>{tipoLabel}</Tag>
                </Space>

                <Radio.Group
                    value={modo}
                    onChange={(e) => {
                        setModo(e.target.value as ModalAceiteEntregaUatGateModo);
                        setMotivoErro(null);
                    }}
                    style={{ width: '100%' }}
                >
                    <Space direction="vertical" size="small" style={{ width: '100%' }}>
                        <Radio value="confirmacao" data-testid="entrega-aceite-uat-modo-confirmacao">
                            Confirmar UAT — a validação com o cliente foi concluída
                        </Radio>
                        {canOverrideUat ? (
                            <Radio value="override" data-testid="entrega-aceite-uat-modo-override">
                                Override com motivo — exceção auditada (visível no histórico)
                            </Radio>
                        ) : null}
                    </Space>
                </Radio.Group>

                {modo === 'override' ? (
                    <Form layout="vertical" requiredMark>
                        <Form.Item
                            label="Motivo do override"
                            required
                            validateStatus={motivoErro ? 'error' : undefined}
                            help={
                                motivoErro ??
                                `Obrigatório · ${MOTIVO_OVERRIDE_UAT_MIN} a ${MOTIVO_OVERRIDE_UAT_MAX} caracteres. Fica registrado na auditoria.`
                            }
                        >
                            <Input.TextArea
                                rows={4}
                                value={motivo}
                                maxLength={MOTIVO_OVERRIDE_UAT_MAX}
                                showCount
                                placeholder="Ex.: Aceite excepcional autorizado pelo sponsor para desbloquear cutover em data X…"
                                onChange={(e) => {
                                    setMotivo(e.target.value);
                                    if (motivoErro) setMotivoErro(null);
                                }}
                                data-testid="entrega-aceite-uat-motivo-override"
                            />
                        </Form.Item>
                    </Form>
                ) : null}
            </Space>
        </Modal>
    );
}
