'use client';

/**
 * ADRs — `/projetos/[id]/software/adrs`
 */

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, Collapse, 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 { useIsMobile } from '@/hooks/useIsMobile';
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';

export type ProjetoSoftwareAdr = {
    id: number;
    codigo?: string | null;
    titulo: string;
    contexto?: string | null;
    problema?: string | null;
    alternativas?: string | null;
    decisao?: string | null;
    justificativa?: string | null;
    consequencias_positivas?: string | null;
    consequencias_negativas?: string | null;
    data_decisao?: string | null;
    responsavel?: string | null;
    status?: string | null;
    versao?: string | null;
    links?: string | null;
    observacoes?: string | null;
};

const FORM_ID = 'projeto-adr-form';

const STATUS = [
    { label: 'Proposto', value: 'proposto' },
    { label: 'Aceito', value: 'aceito' },
    { label: 'Deprecado', value: 'deprecado' },
    { label: 'Superseded', value: 'superseded' },
];

export function ProjetoSoftwareAdrsScreen() {
    const params = useParams();
    const id = params?.id as string;
    const isMobile = useIsMobile();
    const { canEditar, tooltipSemPermissao } = useProjetoWriteGates();
    const tooltipSemEdicao = !canEditar ? tooltipSemPermissao('editar ADRs') : undefined;
    const [modalOpen, setModalOpen] = useState(false);
    const [editing, setEditing] = useState<ProjetoSoftwareAdr | null>(null);
    const [form] = Form.useForm();
    const formModalLayout = useWaygestFormModalProps();

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

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

    const saveMutation = useMutationCache({
        endpoint: editing
            ? API_ENDPOINTS.projetos.adrs.update(id, editing.id)
            : API_ENDPOINTS.projetos.adrs.store(id),
        method: editing ? 'PUT' : 'POST',
        invalidateQueries: [queryKeys.projetos.adrs(id), queryKeys.projetos.documentacaoHealth(id)],
        onSuccess: () => {
            message.success(editing ? 'ADR atualizado.' : 'ADR registrado.');
            setModalOpen(false);
            setEditing(null);
            form.resetFields();
            refetch();
        },
        onError: (error: unknown) => {
            notifyApiError(error, 'Erro ao salvar o ADR.', 'adrs');
        },
    });

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

    const openEdit = (row: ProjetoSoftwareAdr) => {
        setEditing(row);
        form.setFieldsValue({ ...row });
        setModalOpen(true);
    };

    const columns: ColumnsType<ProjetoSoftwareAdr> = useMemo(
        () => [
            { title: 'Código', dataIndex: 'codigo', key: 'codigo', width: 100 },
            { title: 'Título', dataIndex: 'titulo', key: 'titulo' },
            { title: 'Status', dataIndex: 'status', key: 'status', width: 120 },
            { title: 'Data', dataIndex: 'data_decisao', key: 'data', width: 120 },
            {
                title: 'Ações',
                key: 'acoes',
                width: 160,
                render: (_: unknown, row: ProjetoSoftwareAdr) => (
                    <Space>
                        <Button type="link" disabled={!canEditar} onClick={() => openEdit(row)}>
                            Editar
                        </Button>
                        <Button
                            type="link"
                            danger
                            disabled={!canEditar}
                            onClick={() =>
                                confirmDialog({
                                    title: 'Excluir ADR?',
                                    content: `Remover “${row.titulo}”?`,
                                    okText: 'Excluir',
                                    okType: 'danger',
                                    onOk: async () => {
                                        try {
                                            await apiClient.delete(
                                                API_ENDPOINTS.projetos.adrs.destroy(id, row.id),
                                            );
                                            message.success('ADR excluído.');
                                            refetch();
                                        } catch (error) {
                                            notifyApiError(error, 'Erro ao excluir.', 'adrs');
                                        }
                                    },
                                })
                            }
                        >
                            Excluir
                        </Button>
                    </Space>
                ),
            },
        ],
        [canEditar, id, refetch],
    );

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

            <Modal
                {...formModalLayout}
                open={modalOpen}
                title={editing ? 'Editar ADR' : 'Novo ADR'}
                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="ADR-001" />
                    </Form.Item>
                    <Form.Item name="titulo" label="Título" rules={[{ required: true, message: 'Informe o título' }]}>
                        <Input />
                    </Form.Item>
                    <Form.Item name="status" label="Status">
                        <Select options={STATUS} />
                    </Form.Item>
                    <Form.Item name="decisao" label="Decisão">
                        <FormTextarea rows={2} />
                    </Form.Item>
                    {isMobile ? (
                        <Collapse
                            bordered={false}
                            data-testid="software-adr-form-mais-campos"
                            items={[
                                {
                                    key: 'contexto',
                                    label: 'Contexto e análise',
                                    children: (
                                        <>
                                            <Form.Item name="contexto" label="Contexto">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                            <Form.Item name="problema" label="Problema">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                            <Form.Item name="alternativas" label="Alternativas avaliadas">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                            <Form.Item name="justificativa" label="Justificativa">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                            <Form.Item name="consequencias_positivas" label="Consequências positivas">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                            <Form.Item name="consequencias_negativas" label="Consequências negativas">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                        </>
                                    ),
                                },
                                {
                                    key: 'governanca',
                                    label: 'Governança e metadados',
                                    children: (
                                        <>
                                            <Form.Item name="data_decisao" label="Data da decisão (AAAA-MM-DD)">
                                                <Input />
                                            </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="links" label="Links">
                                                <Input />
                                            </Form.Item>
                                            <Form.Item name="observacoes" label="Observações">
                                                <FormTextarea rows={2} />
                                            </Form.Item>
                                        </>
                                    ),
                                },
                            ]}
                        />
                    ) : (
                        <>
                            <Form.Item name="contexto" label="Contexto">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="problema" label="Problema">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="alternativas" label="Alternativas avaliadas">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="justificativa" label="Justificativa">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="consequencias_positivas" label="Consequências positivas">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="consequencias_negativas" label="Consequências negativas">
                                <FormTextarea rows={2} />
                            </Form.Item>
                            <Form.Item name="data_decisao" label="Data da decisão (AAAA-MM-DD)">
                                <Input />
                            </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="links" label="Links">
                                <Input />
                            </Form.Item>
                            <Form.Item name="observacoes" label="Observações">
                                <FormTextarea rows={2} />
                            </Form.Item>
                        </>
                    )}
                </Form>
            </Modal>
        </ProjetoLayout>
    );
}
