'use client';

/**
 * Backup + DR — `/projetos/[id]/software/backup-dr`
 */

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, Tabs, Tooltip } from 'antd';
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 type { ProjetoSoftwareBackupPolitica, ProjetoSoftwareDrPlano } from './types';

const FORM_BKP = 'projeto-backup-politica-form';
const FORM_DR = 'projeto-dr-plano-form';

const STATUS_BKP = [
    { label: 'Ativo', value: 'ativo' },
    { label: 'Inativo', value: 'inativo' },
    { label: 'Planejado', value: 'planejado' },
];

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

const PRIO = [
    { label: 'Baixa', value: 'baixa' },
    { label: 'Média', value: 'media' },
    { label: 'Alta', value: 'alta' },
    { label: 'Crítica', value: 'critica' },
];

export function ProjetoSoftwareBackupDrScreen() {
    const params = useParams();
    const id = params?.id as string;
    const { canEditar, tooltipSemPermissao } = useProjetoWriteGates();
    const tooltipSemEdicao = !canEditar ? tooltipSemPermissao('editar backup/DR') : undefined;

    const [bkpModal, setBkpModal] = useState(false);
    const [editingBkp, setEditingBkp] = useState<ProjetoSoftwareBackupPolitica | null>(null);
    const [drModal, setDrModal] = useState(false);
    const [editingDr, setEditingDr] = useState<ProjetoSoftwareDrPlano | null>(null);
    const [bkpForm] = Form.useForm();
    const [drForm] = Form.useForm();
    const formModalLayout = useWaygestFormModalProps();

    const {
        data: bkpData,
        isLoading: loadingBkp,
        refetch: refetchBkp,
    } = useQueryCache<{ data: ProjetoSoftwareBackupPolitica[] } | ProjetoSoftwareBackupPolitica[]>({
        queryKey: queryKeys.projetos.backupPoliticas(id),
        endpoint: API_ENDPOINTS.projetos.backupPoliticas.index(id),
        enabled: !!id,
        staleTime: 60_000,
    });

    const {
        data: drData,
        isLoading: loadingDr,
        refetch: refetchDr,
    } = useQueryCache<{ data: ProjetoSoftwareDrPlano[] } | ProjetoSoftwareDrPlano[]>({
        queryKey: queryKeys.projetos.drPlanos(id),
        endpoint: API_ENDPOINTS.projetos.drPlanos.index(id),
        enabled: !!id,
        staleTime: 60_000,
    });

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

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

    const saveBkp = useMutationCache({
        endpoint: editingBkp
            ? API_ENDPOINTS.projetos.backupPoliticas.update(id, editingBkp.id)
            : API_ENDPOINTS.projetos.backupPoliticas.store(id),
        method: editingBkp ? 'PUT' : 'POST',
        invalidateQueries: [
            queryKeys.projetos.backupPoliticas(id),
            queryKeys.projetos.documentacaoHealth(id),
        ],
        onSuccess: () => {
            message.success(editingBkp ? 'Política atualizada.' : 'Política registrada.');
            setBkpModal(false);
            setEditingBkp(null);
            bkpForm.resetFields();
            refetchBkp();
        },
        onError: (error: unknown) => {
            notifyApiError(error, 'Erro ao salvar a política.', 'backup-politicas');
        },
    });

    const saveDr = useMutationCache({
        endpoint: editingDr
            ? API_ENDPOINTS.projetos.drPlanos.update(id, editingDr.id)
            : API_ENDPOINTS.projetos.drPlanos.store(id),
        method: editingDr ? 'PUT' : 'POST',
        invalidateQueries: [
            queryKeys.projetos.drPlanos(id),
            queryKeys.projetos.documentacaoHealth(id),
        ],
        onSuccess: () => {
            message.success(editingDr ? 'Plano atualizado.' : 'Plano registrado.');
            setDrModal(false);
            setEditingDr(null);
            drForm.resetFields();
            refetchDr();
        },
        onError: (error: unknown) => {
            notifyApiError(error, 'Erro ao salvar o plano.', 'dr-planos');
        },
    });

    return (
        <ProjetoLayout
            projetoId={id}
            pageTitle="Backup e DR"
            pageIcon="shield-alt"
            titleSection="Especificação"
            breadcrumbItems={[
                { title: 'PROJETO' },
                { title: 'Projeto', path: `/projetos/${id}` },
                { title: 'Backup e DR' },
            ]}
            data-testid="projeto-backup-dr"
        >
            
            <Tabs
                items={[
                    {
                        key: 'backup',
                        label: 'Políticas de backup',
                        children: (
                            <>
                                {backups.length === 0 && !loadingBkp ? (
                                    <ProjetoTipologicoEmptyState
                                        title="Nenhuma política de backup"
                                        domainKey="backupDr"
                                        projetoId={id}
                                        primaryAction={
                                            canEditar ? (
                                                <Button
                                                    type="primary"
                                                    onClick={() => {
                                                        setEditingBkp(null);
                                                        bkpForm.resetFields();
                                                        bkpForm.setFieldsValue({ status: 'ativo' });
                                                        setBkpModal(true);
                                                    }}
                                                >
                                                    Adicionar política
                                                </Button>
                                            ) : undefined
                                        }
                                    />
                                ) : (
                                    <LazyDataTable
                                        columns={[
                                            { title: 'Recurso', dataIndex: 'recurso', key: 'recurso' },
                                            { title: 'Frequência', dataIndex: 'frequencia', key: 'freq' },
                                            { title: 'RPO', dataIndex: 'rpo', key: 'rpo', width: 100 },
                                            { title: 'RTO', dataIndex: 'rto', key: 'rto', width: 100 },
                                            { title: 'Status', dataIndex: 'status', key: 'status', width: 100 },
                                            {
                                                title: 'Ações',
                                                key: 'acoes',
                                                width: 160,
                                                render: (_: unknown, row: ProjetoSoftwareBackupPolitica) => (
                                                    <Space>
                                                        <Button
                                                            type="link"
                                                            disabled={!canEditar}
                                                            onClick={() => {
                                                                setEditingBkp(row);
                                                                bkpForm.setFieldsValue({
                                                                    recurso: row.recurso,
                                                                    tipo_backup: row.tipo_backup ?? '',
                                                                    frequencia: row.frequencia ?? '',
                                                                    retencao: row.retencao ?? '',
                                                                    localizacao: row.localizacao ?? '',
                                                                    rpo: row.rpo ?? '',
                                                                    rto: row.rto ?? '',
                                                                    status: row.status ?? 'ativo',
                                                                    criticidade: row.criticidade ?? undefined,
                                                                    responsavel: row.responsavel ?? '',
                                                                    observacoes: row.observacoes ?? '',
                                                                });
                                                                setBkpModal(true);
                                                            }}
                                                        >
                                                            Editar
                                                        </Button>
                                                        <Button
                                                            type="link"
                                                            danger
                                                            disabled={!canEditar}
                                                            onClick={() =>
                                                                confirmDialog({
                                                                    title: 'Excluir política?',
                                                                    content: `Remover “${row.recurso}”?`,
                                                                    okText: 'Excluir',
                                                                    okType: 'danger',
                                                                    onOk: async () => {
                                                                        try {
                                                                            await apiClient.delete(
                                                                                API_ENDPOINTS.projetos.backupPoliticas.destroy(
                                                                                    id,
                                                                                    row.id,
                                                                                ),
                                                                            );
                                                                            message.success('Política excluída.');
                                                                            refetchBkp();
                                                                        } catch (error) {
                                                                            notifyApiError(
                                                                                error,
                                                                                'Erro ao excluir.',
                                                                                'backup-politicas',
                                                                            );
                                                                        }
                                                                    },
                                                                })
                                                            }
                                                        >
                                                            Excluir
                                                        </Button>
                                                    </Space>
                                                ),
                                            },
                                        ]}
                                        data={backups}
                                        loading={loadingBkp}
                                        rowKey="id"
                                        pagination={{ pageSize: 20, hideOnSinglePage: true }}
                                        ariaRegionLabel="Políticas de backup do projeto"
                                        autoMobileFromColumns={{
                                            testIdPrefix: 'software-backup-politicas',
                                            listHeading: 'Políticas de backup',
                                            getFallbackTitle: (r) =>
                                                r.recurso?.trim() || `Política ${r.id}`,
                                            getSubtitle: (r) =>
                                                [r.frequencia, r.status]
                                                    .filter(Boolean)
                                                    .join(' · ') || undefined,
                                            excludeFieldKeys: ['recurso'],
                                        }}
                                    />
                                )}
                                {canEditar ? (
                                    <ListPageCreateFloatButton
                                        icon={<Plus size={ICON_SIZE_MD} aria-hidden />}
                                        onClick={() => {
                                            setEditingBkp(null);
                                            bkpForm.resetFields();
                                            bkpForm.setFieldsValue({ status: 'ativo' });
                                            setBkpModal(true);
                                        }}
                                        aria-label="Adicionar política de backup"
                                    />
                                ) : null}
                            </>
                        ),
                    },
                    {
                        key: 'dr',
                        label: 'Planos DR',
                        children: (
                            <>
                                {planos.length === 0 && !loadingDr ? (
                                    <ProjetoTipologicoEmptyState
                                        title="Nenhum plano de DR"
                                        domainKey="backupDr"
                                        projetoId={id}
                                        primaryAction={
                                            canEditar ? (
                                                <Button
                                                    type="primary"
                                                    onClick={() => {
                                                        setEditingDr(null);
                                                        drForm.resetFields();
                                                        drForm.setFieldsValue({ status: 'ativo' });
                                                        setDrModal(true);
                                                    }}
                                                >
                                                    Adicionar plano
                                                </Button>
                                            ) : undefined
                                        }
                                    />
                                ) : (
                                    <LazyDataTable
                                        columns={[
                                            { title: 'Cenário', dataIndex: 'cenario', key: 'cenario' },
                                            { title: 'Prioridade', dataIndex: 'prioridade', key: 'prio', width: 110 },
                                            { title: 'RTO', dataIndex: 'rto', key: 'rto', width: 100 },
                                            { title: 'RPO', dataIndex: 'rpo', key: 'rpo', width: 100 },
                                            { title: 'Status', dataIndex: 'status', key: 'status', width: 100 },
                                            {
                                                title: 'Ações',
                                                key: 'acoes',
                                                width: 160,
                                                render: (_: unknown, row: ProjetoSoftwareDrPlano) => (
                                                    <Space>
                                                        <Button
                                                            type="link"
                                                            disabled={!canEditar}
                                                            onClick={() => {
                                                                setEditingDr(row);
                                                                drForm.setFieldsValue({
                                                                    cenario: row.cenario,
                                                                    procedimento: row.procedimento ?? '',
                                                                    dependencias: row.dependencias ?? '',
                                                                    prioridade: row.prioridade ?? undefined,
                                                                    ultimo_teste: row.ultimo_teste ?? '',
                                                                    rto: row.rto ?? '',
                                                                    rpo: row.rpo ?? '',
                                                                    status: row.status ?? 'ativo',
                                                                    responsavel: row.responsavel ?? '',
                                                                    observacoes: row.observacoes ?? '',
                                                                });
                                                                setDrModal(true);
                                                            }}
                                                        >
                                                            Editar
                                                        </Button>
                                                        <Button
                                                            type="link"
                                                            danger
                                                            disabled={!canEditar}
                                                            onClick={() =>
                                                                confirmDialog({
                                                                    title: 'Excluir plano?',
                                                                    content: `Remover “${row.cenario}”?`,
                                                                    okText: 'Excluir',
                                                                    okType: 'danger',
                                                                    onOk: async () => {
                                                                        try {
                                                                            await apiClient.delete(
                                                                                API_ENDPOINTS.projetos.drPlanos.destroy(
                                                                                    id,
                                                                                    row.id,
                                                                                ),
                                                                            );
                                                                            message.success('Plano excluído.');
                                                                            refetchDr();
                                                                        } catch (error) {
                                                                            notifyApiError(
                                                                                error,
                                                                                'Erro ao excluir.',
                                                                                'dr-planos',
                                                                            );
                                                                        }
                                                                    },
                                                                })
                                                            }
                                                        >
                                                            Excluir
                                                        </Button>
                                                    </Space>
                                                ),
                                            },
                                        ]}
                                        data={planos}
                                        loading={loadingDr}
                                        rowKey="id"
                                        pagination={{ pageSize: 20, hideOnSinglePage: true }}
                                        ariaRegionLabel="Planos de DR do projeto"
                                        autoMobileFromColumns={{
                                            testIdPrefix: 'software-dr-planos',
                                            listHeading: 'Planos de DR',
                                            getFallbackTitle: (r) =>
                                                r.cenario?.trim() || `Plano DR ${r.id}`,
                                            getSubtitle: (r) =>
                                                [r.prioridade, r.status]
                                                    .filter(Boolean)
                                                    .join(' · ') || undefined,
                                            excludeFieldKeys: ['cenario'],
                                        }}
                                    />
                                )}
                                {canEditar ? (
                                    <Button
                                        type="dashed"
                                        icon={<Plus size={14} />}
                                        style={{ marginTop: 12 }}
                                        onClick={() => {
                                            setEditingDr(null);
                                            drForm.resetFields();
                                            drForm.setFieldsValue({ status: 'ativo' });
                                            setDrModal(true);
                                        }}
                                    >
                                        Adicionar plano DR
                                    </Button>
                                ) : null}
                            </>
                        ),
                    },
                ]}
            />
            

            <Modal
                {...formModalLayout}
                open={bkpModal}
                title={editingBkp ? 'Editar política' : 'Nova política de backup'}
                onCancel={() => {
                    setBkpModal(false);
                    setEditingBkp(null);
                }}
                footer={
                    <div className={waygestFormModalFooterClassName}>
                        <Button onClick={() => setBkpModal(false)}>Cancelar</Button>
                        <Tooltip title={tooltipSemEdicao}>
                            <Button
                                type="primary"
                                htmlType="submit"
                                form={FORM_BKP}
                                icon={<Save size={ICON_SIZE_MD} aria-hidden />}
                                loading={saveBkp.isPending}
                                disabled={!canEditar}
                            >
                                Salvar
                            </Button>
                        </Tooltip>
                    </div>
                }
            >
                <Form id={FORM_BKP} form={bkpForm} layout="vertical" onFinish={(v) => saveBkp.mutate(v)} scrollToFirstError>
                    <Form.Item name="recurso" label="Recurso" rules={[{ required: true }]}>
                        <Input placeholder="Banco principal, object storage…" />
                    </Form.Item>
                    <Form.Item name="tipo_backup" label="Tipo">
                        <Input placeholder="full / incremental / snapshot…" />
                    </Form.Item>
                    <Form.Item name="frequencia" label="Frequência">
                        <Input />
                    </Form.Item>
                    <Form.Item name="retencao" label="Retenção">
                        <Input />
                    </Form.Item>
                    <Form.Item name="localizacao" label="Localização (sem secrets)">
                        <Input placeholder="região / bucket lógico…" />
                    </Form.Item>
                    <Form.Item name="rpo" label="RPO">
                        <Input placeholder="ex.: 24h" />
                    </Form.Item>
                    <Form.Item name="rto" label="RTO">
                        <Input placeholder="ex.: 4h" />
                    </Form.Item>
                    <Form.Item name="status" label="Status">
                        <Select options={STATUS_BKP} />
                    </Form.Item>
                    <Form.Item name="criticidade" label="Criticidade">
                        <Select allowClear options={PRIO} />
                    </Form.Item>
                    <Form.Item name="responsavel" label="Responsável">
                        <Input />
                    </Form.Item>
                    <Form.Item name="observacoes" label="Observações">
                        <FormTextarea rows={2} />
                    </Form.Item>
                </Form>
            </Modal>

            <Modal
                {...formModalLayout}
                open={drModal}
                title={editingDr ? 'Editar plano DR' : 'Novo plano DR'}
                onCancel={() => {
                    setDrModal(false);
                    setEditingDr(null);
                }}
                footer={
                    <div className={waygestFormModalFooterClassName}>
                        <Button onClick={() => setDrModal(false)}>Cancelar</Button>
                        <Tooltip title={tooltipSemEdicao}>
                            <Button
                                type="primary"
                                htmlType="submit"
                                form={FORM_DR}
                                icon={<Save size={ICON_SIZE_MD} aria-hidden />}
                                loading={saveDr.isPending}
                                disabled={!canEditar}
                            >
                                Salvar
                            </Button>
                        </Tooltip>
                    </div>
                }
            >
                <Form id={FORM_DR} form={drForm} layout="vertical" onFinish={(v) => saveDr.mutate(v)} scrollToFirstError>
                    <Form.Item name="cenario" label="Cenário" rules={[{ required: true }]}>
                        <Input placeholder="Perda de região / ransomware…" />
                    </Form.Item>
                    <Form.Item name="procedimento" label="Procedimento">
                        <FormTextarea rows={4} />
                    </Form.Item>
                    <Form.Item name="dependencias" label="Dependências">
                        <FormTextarea rows={2} />
                    </Form.Item>
                    <Form.Item name="prioridade" label="Prioridade">
                        <Select allowClear options={PRIO} />
                    </Form.Item>
                    <Form.Item name="rto" label="RTO">
                        <Input />
                    </Form.Item>
                    <Form.Item name="rpo" label="RPO">
                        <Input />
                    </Form.Item>
                    <Form.Item name="ultimo_teste" label="Último teste (AAAA-MM-DD)">
                        <Input placeholder="2026-09-01" />
                    </Form.Item>
                    <Form.Item name="status" label="Status">
                        <Select options={STATUS_DR} />
                    </Form.Item>
                    <Form.Item name="responsavel" label="Responsável">
                        <Input />
                    </Form.Item>
                    <Form.Item name="observacoes" label="Observações">
                        <FormTextarea rows={2} />
                    </Form.Item>
                </Form>
            </Modal>
        </ProjetoLayout>
    );
}
