'use client';

/**
 * Modal "Duplicar release" — template com checklist reset (TASK-PPS-061 / PPS-OP-020).
 *
 * Campos: nome, codigo, data_alvo, data_publicacao (editáveis). Status nasce planejada;
 * notas não são copiadas (API).
 */

import React, { useEffect } from 'react';
import { DatePicker, Form, Input, Modal, Typography } from 'antd';
import dayjs, { type Dayjs } from 'dayjs';
import { useMutationCache } from '@/hooks/useMutationCache';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { message } from '@/lib/feedback/message';
import { extractProjetoApiErrorMessage } from '@/features/projetos/utils/extractProjetoApiErrorMessage';
import {
    isProdutoSoftwareTipoDisabledError,
    mensagemProdutoSoftwareTipoDisabled,
} from '@/features/projetos/utils/produtoSoftwareTipoKillSwitch';
import type { ProdutoReleaseDetalhe, ProdutoReleaseResumo } from '../types';
import {
    defaultCodigoCopiaRelease,
    defaultNomeCopiaRelease,
} from '../utils/releaseDuplicarDefaults';
import { projetoProdutoReleasesQueryKey } from '../utils/produtoQueryKeys';

export type ModalDuplicarReleaseOrigem = Pick<
    ProdutoReleaseResumo,
    'id' | 'nome' | 'codigo' | 'data_alvo' | 'data_publicacao'
>;

export interface ModalDuplicarReleaseProps {
    open: boolean;
    projetoId: string;
    origem: ModalDuplicarReleaseOrigem | null;
    onClose: () => void;
    /** Após 201 — caller navega / refresca; `nova` inclui id e readiness. */
    onDuplicated: (nova: ProdutoReleaseDetalhe) => void;
}

type FormValues = {
    nome: string;
    codigo: string;
    data_alvo?: Dayjs | null;
    data_publicacao?: Dayjs | null;
};

type DuplicarBody = {
    nome: string;
    codigo: string;
    data_alvo?: string | null;
    data_publicacao?: string | null;
};

type DuplicarApiResponse = { data: ProdutoReleaseDetalhe; message?: string };

/**
 * Duplica a release via `POST …/releases/{id}/duplicar` (AuthZ `update`).
 */
export function ModalDuplicarRelease({
    open,
    projetoId,
    origem,
    onClose,
    onDuplicated,
}: ModalDuplicarReleaseProps) {
    const [form] = Form.useForm<FormValues>();

    const duplicarMutation = useMutationCache<DuplicarApiResponse, DuplicarBody>({
        endpoint: () =>
            API_ENDPOINTS.projetos.releases.duplicar(projetoId, origem?.id ?? 0),
        method: 'POST',
        invalidateQueries: [projetoProdutoReleasesQueryKey(projetoId)],
        retry: 0,
    });

    useEffect(() => {
        if (!open || !origem) {
            form.resetFields();
            return;
        }
        form.setFieldsValue({
            nome: defaultNomeCopiaRelease(origem.nome),
            codigo: defaultCodigoCopiaRelease(origem.codigo),
            data_alvo: origem.data_alvo ? dayjs(origem.data_alvo) : null,
            data_publicacao: origem.data_publicacao ? dayjs(origem.data_publicacao) : null,
        });
    }, [open, origem, form]);

    const handleSubmit = async () => {
        if (!origem || duplicarMutation.isPending) return;
        const values = await form.validateFields();
        try {
            const response = await duplicarMutation.mutateAsync({
                nome: values.nome.trim(),
                codigo: values.codigo.trim().toLowerCase(),
                data_alvo: values.data_alvo?.format('YYYY-MM-DD') ?? null,
                data_publicacao: values.data_publicacao?.format('YYYY-MM-DD') ?? null,
            });
            const nova = response?.data ?? (response as unknown as ProdutoReleaseDetalhe);
            message.success('Release duplicada como template (checklist pendente).');
            form.resetFields();
            onClose();
            onDuplicated(nova);
        } catch (err) {
            if (isProdutoSoftwareTipoDisabledError(err)) {
                message.warning(mensagemProdutoSoftwareTipoDisabled(err));
                return;
            }
            message.error(
                extractProjetoApiErrorMessage(
                    err,
                    'Não foi possível duplicar a release. Verifique o código e tente novamente.',
                ),
            );
        }
    };

    return (
        <Modal
            title="Duplicar release"
            open={open}
            onCancel={onClose}
            onOk={() => void handleSubmit()}
            okText="Duplicar"
            cancelText="Cancelar"
            confirmLoading={duplicarMutation.isPending}
            destroyOnHidden
            data-testid="modal-duplicar-release"
        >
            <Typography.Paragraph type="secondary" style={{ marginBottom: 16 }}>
                {origem
                    ? `Cria uma nova release a partir de "${origem.nome}" (${origem.codigo}). O checklist nasce pendente; datas são editáveis; notas não são copiadas.`
                    : 'Cria uma nova release a partir do template seleccionado.'}
            </Typography.Paragraph>

            <Form form={form} layout="vertical" requiredMark>
                <Form.Item
                    name="nome"
                    label="Nome"
                    rules={[
                        { required: true, message: 'Informe o nome da nova release' },
                        { max: 128, message: 'Máximo de 128 caracteres' },
                    ]}
                >
                    <Input
                        placeholder="ex.: Cópia de v2.4.0"
                        autoFocus
                        data-testid="duplicar-release-nome"
                    />
                </Form.Item>
                <Form.Item
                    name="codigo"
                    label="Código"
                    extra="Letras minúsculas, números, ponto, hífen ou underscore. Deve ser único no programa (inclui releases excluídas)."
                    rules={[
                        { required: true, message: 'Informe o código da nova release' },
                        { max: 64, message: 'Máximo de 64 caracteres' },
                        {
                            pattern: /^[a-z0-9.\-_]+$/,
                            message: 'Use apenas a-z, 0-9, ponto, hífen ou underscore',
                        },
                    ]}
                    normalize={(value: string) => (typeof value === 'string' ? value.toLowerCase() : value)}
                >
                    <Input placeholder="ex.: v2.4.0-copia" data-testid="duplicar-release-codigo" />
                </Form.Item>
                <Form.Item name="data_alvo" label="Data alvo">
                    <DatePicker
                        style={{ width: '100%' }}
                        format="DD/MM/YYYY"
                        data-testid="duplicar-release-data-alvo"
                    />
                </Form.Item>
                <Form.Item name="data_publicacao" label="Data de publicação">
                    <DatePicker
                        style={{ width: '100%' }}
                        format="DD/MM/YYYY"
                        data-testid="duplicar-release-data-publicacao"
                    />
                </Form.Item>
            </Form>
        </Modal>
    );
}
