'use client';

/**
 * Modal de override auditado ao publicar release com checklist pendente (TASK-PPS-004 UX).
 */

import React, { useEffect, useState } from 'react';
import { Alert, Button, Form, Input, Modal, Space, Typography } from 'antd';
import {
    mergeWaygestFormModalBodyStyles,
    useWaygestFormModalProps,
    waygestFormModalFooterClassName,
} from '@/hooks/useWaygestFormModalProps';
import {
    MOTIVO_OVERRIDE_PUBLICACAO_MAX,
    MOTIVO_OVERRIDE_PUBLICACAO_MIN,
} from '../utils/releasePublicacaoGate';

export type ModalOverridePublicacaoReleaseProps = {
    open: boolean;
    /** Mensagem do 422 já sanitizada para o operador. */
    gateMessage: string;
    confirmLoading?: boolean;
    onCancel: () => void;
    onConfirm: (motivo: string) => void;
};

/**
 * Pede motivo (≥10 chars) antes de reenviar `override_publicacao` + `motivo_override`.
 */
export function ModalOverridePublicacaoRelease({
    open,
    gateMessage,
    confirmLoading = false,
    onCancel,
    onConfirm,
}: ModalOverridePublicacaoReleaseProps) {
    const formModalLayout = useWaygestFormModalProps();
    const [motivo, setMotivo] = useState('');
    const [motivoErro, setMotivoErro] = useState<string | null>(null);

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

    const handleSubmit = () => {
        const trimmed = motivo.trim();
        if (trimmed.length < MOTIVO_OVERRIDE_PUBLICACAO_MIN) {
            setMotivoErro(`Informe pelo menos ${MOTIVO_OVERRIDE_PUBLICACAO_MIN} caracteres.`);
            return;
        }
        if (trimmed.length > MOTIVO_OVERRIDE_PUBLICACAO_MAX) {
            setMotivoErro(`Máximo de ${MOTIVO_OVERRIDE_PUBLICACAO_MAX} caracteres.`);
            return;
        }
        setMotivoErro(null);
        onConfirm(trimmed);
    };

    return (
        <Modal
            open={open}
            title="Publicar release com override"
            onCancel={onCancel}
            confirmLoading={confirmLoading}
            footer={
                <div className={waygestFormModalFooterClassName}>
                    <Button onClick={onCancel} disabled={confirmLoading}>
                        Cancelar
                    </Button>
                    <Button type="primary" danger loading={confirmLoading} onClick={handleSubmit}>
                        Publicar 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="release-override-publicacao-modal"
        >
            <Space direction="vertical" size="middle" style={{ width: '100%' }}>
                <Alert
                    type="warning"
                    showIcon
                    message="Checklist incompleto"
                    description={
                        gateMessage ||
                        'Há superfícies ainda não prontas. Só avance com override se o go-live foi acordado.'
                    }
                />
                <Typography.Paragraph type="secondary" style={{ marginBottom: 0 }}>
                    O motivo fica registado na auditoria (actor + texto). Prefira concluir o checklist
                    antes de forçar a publicação.
                </Typography.Paragraph>
                <Form layout="vertical" requiredMark>
                    <Form.Item
                        label="Motivo do override"
                        required
                        validateStatus={motivoErro ? 'error' : undefined}
                        help={
                            motivoErro ??
                            `Obrigatório · ${MOTIVO_OVERRIDE_PUBLICACAO_MIN} a ${MOTIVO_OVERRIDE_PUBLICACAO_MAX} caracteres.`
                        }
                    >
                        <Input.TextArea
                            rows={4}
                            value={motivo}
                            maxLength={MOTIVO_OVERRIDE_PUBLICACAO_MAX}
                            showCount
                            placeholder="Ex.: Go-live acordado com sponsor apesar de superfície bloqueada na superfície X…"
                            onChange={(e) => {
                                setMotivo(e.target.value);
                                if (motivoErro) setMotivoErro(null);
                            }}
                            data-testid="release-override-publicacao-motivo"
                        />
                    </Form.Item>
                </Form>
            </Space>
        </Modal>
    );
}
