'use client';

/**
 * Regras de negócio tipológicas — `/projetos/[id]/software/regras-negocio`.
 */

import { Plus, Save } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React, { useMemo, useState } from 'react';
import { useParams } from 'next/navigation';
import { Button, Form, Input, Modal, Select, Space, Tooltip } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import { message } from '@/lib/feedback/message';
import { notifyApiError } from '@/lib/feedback/notifyApiError';
import { confirmDialog } from '@/lib/feedback/confirmDialog';
import { FormTextarea } from '@/components/form';
import {
    useWaygestFormModalProps,
    waygestFormModalFooterClassName,
} from '@/hooks/useWaygestFormModalProps';
import { useQueryCache } from '@/hooks/useQueryCache';
import { useMutationCache } from '@/hooks/useMutationCache';
import { useProjetoWriteGates } from '@/features/projetos/hooks/useProjetoWriteGates';
import { queryKeys } from '@/lib/cache/queryKeys';
import { API_ENDPOINTS } from '@/lib/api/endpoints';
import apiClient from '@/lib/api/client';
import ProjetoLayout from '@/components/layouts/ProjetoLayout';
import { ListPageCreateFloatButton } from '@/components/listings';
import { LazyDataTable } from '@/components/lazy';
import {
    ProjetoTipologicoEmptyState,
} from '@/features/projetos/projeto-tipologico-empty-state';
import {
    PRIORIDADE_OPTIONS,
    type ProjetoSoftwareFuncionalidade,
    type ProjetoSoftwareRegraNegocio,
} from '@/features/projetos/projeto-software-funcionalidades/types';

const FORM_ID = 'projeto-software-regra-negocio-form';

const STATUS_OPTIONS = [
    { label: 'Ativo', value: 'ativo' },
    { label: 'Inativo', value: 'inativo' },
    { label: 'Rascunho', value: 'rascunho' },
    { label: 'Deprecado', value: 'deprecado' },
];

type ModuloOpt = { id: number; nome: string };

export function ProjetoSoftwareRegrasNegocioScreen() {
    const params = useParams();
    const id = params?.id as string;
    const { canEditar, tooltipSemPermissao } = useProjetoWriteGates();
    const tooltipSemEdicao = !canEditar
        ? tooltipSemPermissao('editar regras de negócio')
        : undefined;
    const [modalOpen, setModalOpen] = useState(false);
    const [editing, setEditing] = useState<ProjetoSoftwareRegraNegocio | null>(null);
    const [form] = Form.useForm();
    const formModalLayout = useWaygestFormModalProps();

    const { data: listData, isLoading, refetch } = useQueryCache<
        { data: ProjetoSoftwareRegraNegocio[] } | ProjetoSoftwareRegraNegocio[]
    >({
        queryKey: queryKeys.projetos.regrasNegocio(id),
        endpoint: API_ENDPOINTS.projetos.regrasNegocio.index(id),
        enabled: !!id,
        staleTime: 60_000,
    });

    const { data: funcsData } = useQueryCache<
        { data: ProjetoSoftwareFuncionalidade[] } | ProjetoSoftwareFuncionalidade[]
    >({
        queryKey: queryKeys.projetos.funcionalidadesList(id, { per_page: 100 }),
        endpoint: API_ENDPOINTS.projetos.funcionalidades.index(id),
        params: { per_page: 100 },
        enabled: !!id,
        staleTime: 60_000,
    });

    const { data: modulosData } = useQueryCache<{ data?: ModuloOpt[] } | ModuloOpt[]>({
        queryKey: queryKeys.projetos.modulos(id),
        endpoint: API_ENDPOINTS.projetos.modulos.index(id),
        enabled: !!id,
        staleTime: 60_000,
    });

    const itens = useMemo(() => {
        if (Array.isArray(listData)) return listData;
        return listData?.data ?? [];
    }, [listData]);

    const funcionalidades = useMemo(() => {
        if (Array.isArray(funcsData)) return funcsData;
        return funcsData?.data ?? [];
    }, [funcsData]);

    const modulos = useMemo(() => {
        if (Array.isArray(modulosData)) return modulosData;
        return modulosData?.data ?? [];
    }, [modulosData]);

    const saveMutation = useMutationCache({
        endpoint: editing
            ? API_ENDPOINTS.projetos.regrasNegocio.update(id, editing.id)
            : API_ENDPOINTS.projetos.regrasNegocio.store(id),
        method: editing ? 'PUT' : 'POST',
        invalidateQueries: [
            queryKeys.projetos.regrasNegocio(id),
            queryKeys.projetos.documentacaoHealth(id),
        ],
        onSuccess: () => {
            message.success(editing ? 'Regra atualizada.' : 'Regra registrada.');
            setModalOpen(false);
            setEditing(null);
            form.resetFields();
            refetch();
        },
        onError: (error: unknown) => {
            notifyApiError(error, 'Erro ao salvar a regra.', 'regras-negocio');
        },
    });

    const openCreate = () => {
        setEditing(null);
        form.resetFields();
        form.setFieldsValue({ status: 'ativo' });
        setModalOpen(true);
    };

    const openEdit = (row: ProjetoSoftwareRegraNegocio) => {
        setEditing(row);
        form.setFieldsValue({
            codigo: row.codigo ?? '',
            titulo: row.titulo,
            projeto_modulo_id: row.projeto_modulo_id ?? undefined,
            funcionalidade_id: row.funcionalidade_id ?? undefined,
            requisito_id: row.requisito_id ?? undefined,
            descricao: row.descricao ?? '',
            condicao: row.condicao ?? '',
            comportamento_esperado: row.comportamento_esperado ?? '',
            excecoes: row.excecoes ?? '',
            status: row.status ?? 'ativo',
            prioridade: row.prioridade ?? undefined,
            origem_negocio: row.origem_negocio ?? '',
            responsavel: row.responsavel ?? '',
            versao: row.versao ?? '',
            observacoes: row.observacoes ?? '',
        });
        setModalOpen(true);
    };

    const handleDelete = (row: ProjetoSoftwareRegraNegocio) => {
        confirmDialog({
            title: 'Excluir regra?',
            content: `Remover “${row.titulo}”?`,
            okText: 'Excluir',
            okType: 'danger',
            onOk: async () => {
                try {
                    await apiClient.delete(API_ENDPOINTS.projetos.regrasNegocio.destroy(id, row.id));
                    message.success('Regra excluída.');
                    refetch();
                } catch (error) {
                    notifyApiError(error, 'Erro ao excluir.', 'regras-negocio');
                }
            },
        });
    };

    const columns: ColumnsType<ProjetoSoftwareRegraNegocio> = useMemo(
        () => [
            { title: 'Código', dataIndex: 'codigo', key: 'codigo', width: 100 },
            { title: 'Título', dataIndex: 'titulo', key: 'titulo' },
            {
                title: 'Funcionalidade',
                key: 'fn',
                render: (_: unknown, r: ProjetoSoftwareRegraNegocio) =>
                    r.funcionalidade?.nome ?? '—',
            },
            { title: 'Status', dataIndex: 'status', key: 'status', width: 110 },
            {
                title: 'Ações',
                key: 'acoes',
                width: 160,
                render: (_: unknown, row: ProjetoSoftwareRegraNegocio) => (
                    <Space>
                        <Button type="link" disabled={!canEditar} onClick={() => openEdit(row)}>
                            Editar
                        </Button>
                        <Button
                            type="link"
                            danger
                            disabled={!canEditar}
                            onClick={() => handleDelete(row)}
                        >
                            Excluir
                        </Button>
                    </Space>
                ),
            },
        ],
        [canEditar],
    );

    return (
        <ProjetoLayout
            projetoId={id}
            pageTitle="Regras de negócio"
            pageIcon="balance-scale"
            titleSection="Especificação"
            breadcrumbItems={[
                { title: 'PROJETO' },
                { title: 'Projeto', path: `/projetos/${id}` },
                { title: 'Regras de negócio' },
            ]}
            data-testid="projeto-regras-negocio"
        >
            
            {itens.length === 0 && !isLoading ? (
                <ProjetoTipologicoEmptyState
                    title="Nenhuma regra de negócio estruturada"
                    domainKey="regrasNegocio"
                    projetoId={id}
                    primaryAction={
                        canEditar ? (
                            <Button type="primary" onClick={openCreate}>
                                Adicionar regra
                            </Button>
                        ) : undefined
                    }
                />
            ) : (
                <LazyDataTable
                    columns={columns}
                    data={itens}
                    loading={isLoading}
                    rowKey="id"
                    pagination={{ pageSize: 20, hideOnSinglePage: true }}
                    ariaRegionLabel="Regras de negócio do projeto"
                    autoMobileFromColumns={{
                        testIdPrefix: 'software-regras-negocio',
                        listHeading: 'Lista de regras de negócio',
                        getFallbackTitle: (r) =>
                            r.titulo?.trim() || r.codigo?.trim() || `Regra ${r.id}`,
                    }}
                />
            )}
            {canEditar ? (
                <ListPageCreateFloatButton
                    icon={<Plus size={ICON_SIZE_MD} aria-hidden />}
                    onClick={openCreate}
                    aria-label="Adicionar regra de negócio"
                />
            ) : null}
            

            <Modal
                {...formModalLayout}
                open={modalOpen}
                title={editing ? 'Editar regra' : 'Nova regra de negócio'}
                onCancel={() => {
                    setModalOpen(false);
                    setEditing(null);
                }}
                footer={
                    <div className={waygestFormModalFooterClassName}>
                        <Button onClick={() => setModalOpen(false)}>Cancelar</Button>
                        <Tooltip title={tooltipSemEdicao}>
                            <Button
                                type="primary"
                                htmlType="submit"
                                form={FORM_ID}
                                icon={<Save size={ICON_SIZE_MD} aria-hidden />}
                                loading={saveMutation.isPending}
                                disabled={!canEditar}
                            >
                                Salvar
                            </Button>
                        </Tooltip>
                    </div>
                }
            >
                <Form id={FORM_ID} form={form} layout="vertical" onFinish={(v) => saveMutation.mutate(v)} scrollToFirstError>
                    <Form.Item name="codigo" label="Código">
                        <Input placeholder="RN-001" />
                    </Form.Item>
                    <Form.Item name="titulo" label="Título" rules={[{ required: true, message: 'Informe o título' }]}>
                        <Input />
                    </Form.Item>
                    <Form.Item name="projeto_modulo_id" label="Módulo">
                        <Select
                            allowClear
                            showSearch
                            optionFilterProp="label"
                            options={modulos.map((m) => ({ label: m.nome, value: m.id }))}
                        />
                    </Form.Item>
                    <Form.Item name="funcionalidade_id" label="Funcionalidade">
                        <Select
                            allowClear
                            showSearch
                            optionFilterProp="label"
                            options={funcionalidades.map((f) => ({ label: f.nome, value: f.id }))}
                        />
                    </Form.Item>
                    <Form.Item name="condicao" label="Condição">
                        <FormTextarea rows={2} placeholder="Quando…" />
                    </Form.Item>
                    <Form.Item name="comportamento_esperado" label="Comportamento esperado">
                        <FormTextarea rows={2} placeholder="Então o sistema…" />
                    </Form.Item>
                    <Form.Item name="excecoes" label="Exceções">
                        <FormTextarea rows={2} />
                    </Form.Item>
                    <Form.Item name="descricao" label="Descrição">
                        <FormTextarea rows={2} />
                    </Form.Item>
                    <Form.Item name="status" label="Status">
                        <Select options={STATUS_OPTIONS} />
                    </Form.Item>
                    <Form.Item name="prioridade" label="Prioridade">
                        <Select allowClear options={PRIORIDADE_OPTIONS} />
                    </Form.Item>
                    <Form.Item name="origem_negocio" label="Origem de negócio">
                        <Input placeholder="Cliente, regulação, análise…" />
                    </Form.Item>
                    <Form.Item name="responsavel" label="Responsável">
                        <Input />
                    </Form.Item>
                    <Form.Item name="versao" label="Versão">
                        <Input />
                    </Form.Item>
                    <Form.Item name="observacoes" label="Observações">
                        <FormTextarea rows={2} />
                    </Form.Item>
                </Form>
            </Modal>
        </ProjetoLayout>
    );
}
