'use client';

/**
 * CTA secundário «Adiar Git» com motivo obrigatório (TASK-APR-038).
 * Só no hub React quando o passo Git está incompleto.
 */

import { Button, Form, Input, Modal } from 'antd';
import { useState } from 'react';

import { message } from '@/lib/feedback/message';
import { useAuth } from '@/contexts/AuthContext';

import {
    APLICACAO_REACT_GIT_ADIAR_MOTIVO_MAX,
    APLICACAO_REACT_GIT_ADIAR_MOTIVO_MIN,
    registrarAplicacaoReactGitAdiar,
} from './registrarAplicacaoReactGitAdiar';

export type AplicacaoReactGitAdiarButtonProps = {
    projetoId: string;
    /** Filho Front-end — copy reforça nascença `ignorar`. */
    isFilhoFrontEnd?: boolean;
};

/**
 * Abre modal de motivo e regista adiar auditado (comentário + localStorage).
 */
export function AplicacaoReactGitAdiarButton({
    projetoId,
    isFilhoFrontEnd = false,
}: AplicacaoReactGitAdiarButtonProps) {
    const { user } = useAuth();
    const [open, setOpen] = useState(false);
    const [submitting, setSubmitting] = useState(false);
    const [form] = Form.useForm<{ motivo: string }>();

    const handleOk = async () => {
        try {
            const values = await form.validateFields();
            setSubmitting(true);
            await registrarAplicacaoReactGitAdiar({
                projetoId,
                motivo: values.motivo,
                usuarioId: user?.id ?? null,
            });
            message.success('Git adiado com registro no projeto. O checklist avançou.');
            setOpen(false);
            form.resetFields();
        } catch (err) {
            if (err && typeof err === 'object' && 'errorFields' in err) return;
            const msg =
                err instanceof Error
                    ? err.message
                    : 'Não foi possível adiar o Git. Tente novamente.';
            message.error(msg);
        } finally {
            setSubmitting(false);
        }
    };

    return (
        <>
            <Button
                type="default"
                data-testid="aplicacao-react-git-adiar-cta"
                onClick={() => setOpen(true)}
            >
                Adiar Git
            </Button>
            <Modal
                title="Adiar configuração do Git"
                open={open}
                onCancel={() => (submitting ? undefined : setOpen(false))}
                onOk={() => void handleOk()}
                okText="Confirmar adiamento"
                cancelText="Cancelar"
                confirmLoading={submitting}
                destroyOnHidden
                data-testid="aplicacao-react-git-adiar-modal"
            >
                <p style={{ marginBottom: 12, color: 'var(--text-secondary)' }}>
                    {isFilhoFrontEnd
                        ? 'Este filho Front-end nasceu sem repositório (ação ignorar). Informe o motivo para avançar o onboarding — o adiamento fica registrado nos comentários do projeto.'
                        : 'Informe o motivo para adiar a ligação do repositório. O registro fica nos comentários do projeto para auditoria.'}
                </p>
                <Form form={form} layout="vertical">
                    <Form.Item
                        name="motivo"
                        label="Motivo"
                        rules={[
                            { required: true, message: 'Informe o motivo do adiamento.' },
                            {
                                min: APLICACAO_REACT_GIT_ADIAR_MOTIVO_MIN,
                                message: `Mínimo de ${APLICACAO_REACT_GIT_ADIAR_MOTIVO_MIN} caracteres.`,
                            },
                            {
                                max: APLICACAO_REACT_GIT_ADIAR_MOTIVO_MAX,
                                message: `Máximo de ${APLICACAO_REACT_GIT_ADIAR_MOTIVO_MAX} caracteres.`,
                            },
                        ]}
                    >
                        <Input.TextArea
                            rows={4}
                            maxLength={APLICACAO_REACT_GIT_ADIAR_MOTIVO_MAX}
                            showCount
                            placeholder="Ex.: Credenciais GitLab do cliente ainda não disponíveis; previsão na sprint 1."
                            data-testid="aplicacao-react-git-adiar-motivo"
                        />
                    </Form.Item>
                </Form>
            </Modal>
        </>
    );
}
