'use client';

import React, { useMemo } from 'react';
import { Form, Modal, Select, DatePicker } from 'antd';
import { message } from '@/lib/feedback/message';
import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
import { useQueryCache } from '@/hooks/useQueryCache';
import { useMutationCache } from '@/hooks/useMutationCache';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import { queryKeys } from '@/lib/cache/queryKeys';
import type { LogEntry } from '../types';

export interface ModalGerarTarefaCorrecaoLogProps {
    open: boolean;
    onClose: () => void;
    log: LogEntry;
    logId: string;
    onSuccessNavigate: (tarefaId: number) => void;
}

export function ModalGerarTarefaCorrecaoLog({
    open,
    onClose,
    log,
    logId,
    onSuccessNavigate,
}: ModalGerarTarefaCorrecaoLogProps) {
    const [form] = Form.useForm<{ responsavel_id: number; data_vencimento: Dayjs }>();

    const { data: usuariosResponse } = useQueryCache<{ data: Array<{ id: number; nome: string }> }>({
        queryKey: queryKeys.usuariosCatalog.list('log-tarefa-correcao'),
        endpoint: API_ENDPOINTS.admin.usuarios.index,
        params: { per_page: 1000, page: 1 },
        staleTime: 5 * 60 * 1000,
        enabled: open,
    });

    const options = useMemo(() => {
        const list = usuariosResponse?.data ?? [];
        return list.map((u) => ({ label: u.nome ?? `Usuário #${u.id}`, value: u.id }));
    }, [usuariosResponse?.data]);

    const podeSubmeter = log.projeto_id != null;

    const { mutateAsync: criarTarefa, isPending } = useMutationCache<
        { id: number; chave_tarefa?: string | null },
        { responsavel_id: number; data_vencimento: string }
    >({
        endpoint: API_ENDPOINTS.projetos.logs.tarefaCorrecao(logId),
        method: 'POST',
        invalidateQueries: [queryKeys.desenvolvimento.tarefas.all],
    });

    const handleOk = async () => {
        if (!podeSubmeter) {
            message.warning('Associe este log a um projeto antes de criar a tarefa.');
            return;
        }
        try {
            const v = await form.validateFields();
            const res = await criarTarefa({
                responsavel_id: v.responsavel_id,
                data_vencimento: v.data_vencimento.format('YYYY-MM-DD'),
            });
            message.success(
                res.chave_tarefa
                    ? `Tarefa ${res.chave_tarefa} criada.`
                    : `Tarefa #${res.id} criada.`
            );
            form.resetFields();
            onClose();
            onSuccessNavigate(res.id);
        } catch (e: unknown) {
            if (e && typeof e === 'object' && 'errorFields' in e) return;
            const err = e as {
                response?: {
                    status?: number;
                    data?: {
                        message?: string;
                        errors?: Record<string, string[]>;
                        tarefa_existente?: { id: number; chave_tarefa?: string | null; titulo?: string };
                    };
                };
            };
            if (err.response?.status === 409 && err.response.data?.tarefa_existente?.id) {
                const t = err.response.data.tarefa_existente;
                message.warning(
                    err.response.data.message ||
                        `Já existe tarefa #${t.id}. A redireccionar…`,
                );
                form.resetFields();
                onClose();
                onSuccessNavigate(t.id);
                return;
            }
            const apiMsg =
                err.response?.data?.message ||
                (err.response?.data?.errors
                    ? Object.values(err.response.data.errors).flat().join(' ')
                    : null);
            message.error(apiMsg || 'Não foi possível criar a tarefa. Verifique as permissões e tente novamente.');
        }
    };

    const handleCancel = () => {
        form.resetFields();
        onClose();
    };

    return (
        <Modal
            title="Gerar tarefa de correção"
            open={open}
            onCancel={handleCancel}
            onOk={() => void handleOk()}
            okText="Criar tarefa"
            cancelText="Cancelar"
            confirmLoading={isPending}
            okButtonProps={{ disabled: !podeSubmeter }}
            destroyOnClose
            width={480}
        >
            {!podeSubmeter ? (
                <p style={{ marginBottom: 0 }}>
                    Este registro não tem projeto associado. É necessário um projeto para criar a tarefa no quadro
                    de desenvolvimento.
                </p>
            ) : (
                <Form form={form} layout="vertical">
                    <Form.Item
                        label="Responsável"
                        name="responsavel_id"
                        rules={[{ required: true, message: 'Selecione o responsável.' }]}
                    >
                        <Select
                            showSearch
                            placeholder="Quem executa a correção"
                            optionFilterProp="label"
                            options={options}
                        />
                    </Form.Item>
                    <Form.Item
                        label="Data de previsão (vencimento)"
                        name="data_vencimento"
                        rules={[{ required: true, message: 'Informe a data de previsão.' }]}
                    >
                        <DatePicker
                            style={{ width: '100%' }}
                            format="DD/MM/YYYY"
                            disabledDate={(d) => d.isBefore(dayjs().startOf('day'))}
                        />
                    </Form.Item>
                </Form>
            )}
        </Modal>
    );
}
