'use client';

/**
 * Segurança tipológica + inventário LGPD — `/projetos/[id]/software/seguranca`
 */

import { Plus, Save } from 'lucide-react';
import { ICON_SIZE_MD } from '@/components/icons';
import React, { useEffect, useMemo, useState } from 'react';
import { useParams } from 'next/navigation';
import { Button, Col, Form, Input, Modal, Row, Select, Space, Switch, 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 { ProjetoSoftwareDadoLgpd, ProjetoSoftwareSegurancaPerfil } from './types';

const FORM_SEC = 'projeto-seguranca-perfil-form';
const FORM_LGPD = 'projeto-dado-lgpd-form';

const BOOL_OPTS = [
    { label: 'Não definido', value: '' },
    { label: 'Sim', value: 'true' },
    { label: 'Não', value: 'false' },
];

function boolToSelect(v: boolean | null | undefined): string {
    if (v === true) return 'true';
    if (v === false) return 'false';
    return '';
}

function selectToBool(v: unknown): boolean | null {
    if (v === 'true' || v === true) return true;
    if (v === 'false' || v === false) return false;
    return null;
}

export function ProjetoSoftwareSegurancaScreen() {
    const params = useParams();
    const id = params?.id as string;
    const { canEditar, tooltipSemPermissao } = useProjetoWriteGates();
    const tooltipSemEdicao = !canEditar ? tooltipSemPermissao('editar segurança') : undefined;

    const [lgpdModal, setLgpdModal] = useState(false);
    const [editingLgpd, setEditingLgpd] = useState<ProjetoSoftwareDadoLgpd | null>(null);
    const [secForm] = Form.useForm();
    const [lgpdForm] = Form.useForm();
    const formModalLayout = useWaygestFormModalProps();

    const {
        data: secData,
        isLoading: loadingSec,
        refetch: refetchSec,
    } = useQueryCache<ProjetoSoftwareSegurancaPerfil>({
        queryKey: queryKeys.projetos.segurancaPerfil(id),
        endpoint: API_ENDPOINTS.projetos.segurancaPerfil.show(id),
        enabled: !!id,
        staleTime: 60_000,
    });

    const {
        data: lgpdData,
        isLoading: loadingLgpd,
        refetch: refetchLgpd,
    } = useQueryCache<{ data: ProjetoSoftwareDadoLgpd[] } | ProjetoSoftwareDadoLgpd[]>({
        queryKey: queryKeys.projetos.dadosLgpd(id),
        endpoint: API_ENDPOINTS.projetos.dadosLgpd.index(id),
        enabled: !!id,
        staleTime: 60_000,
    });

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

    useEffect(() => {
        if (!secData) return;
        secForm.setFieldsValue({
            ...secData,
            mfa: boolToSelect(secData.mfa),
            criptografia_transito: boolToSelect(secData.criptografia_transito),
            criptografia_repouso: boolToSelect(secData.criptografia_repouso),
            rate_limiting: boolToSelect(secData.rate_limiting),
            protecao_brute_force: boolToSelect(secData.protecao_brute_force),
            csrf: boolToSelect(secData.csrf),
            auditoria_logging: boolToSelect(secData.auditoria_logging),
            confirmado_manual: !!secData.confirmado_manual,
        });
    }, [secData, secForm]);

    const saveSec = useMutationCache({
        mutationFn: async (values: Record<string, unknown>) => {
            const payload = {
                ...values,
                mfa: selectToBool(values.mfa),
                criptografia_transito: selectToBool(values.criptografia_transito),
                criptografia_repouso: selectToBool(values.criptografia_repouso),
                rate_limiting: selectToBool(values.rate_limiting),
                protecao_brute_force: selectToBool(values.protecao_brute_force),
                csrf: selectToBool(values.csrf),
                auditoria_logging: selectToBool(values.auditoria_logging),
                origem: 'manual',
                confianca: values.confirmado_manual ? 'alta' : 'media',
            };
            await apiClient.put(API_ENDPOINTS.projetos.segurancaPerfil.update(id), payload);
        },
        onSuccess: async () => {
            message.success('Perfil de segurança salvo.');
            await refetchSec();
        },
        onError: (e) => notifyApiError(e, 'Não foi possível salvar o perfil de segurança.'),
    });

    const saveLgpd = useMutationCache({
        mutationFn: async (values: Record<string, unknown>) => {
            if (editingLgpd) {
                await apiClient.put(
                    API_ENDPOINTS.projetos.dadosLgpd.update(id, editingLgpd.id),
                    values
                );
            } else {
                await apiClient.post(API_ENDPOINTS.projetos.dadosLgpd.store(id), {
                    ...values,
                    origem: 'manual',
                });
            }
        },
        onSuccess: async () => {
            message.success(editingLgpd ? 'Item LGPD atualizado.' : 'Item LGPD criado.');
            setLgpdModal(false);
            setEditingLgpd(null);
            lgpdForm.resetFields();
            await refetchLgpd();
        },
        onError: (e) => notifyApiError(e, 'Não foi possível salvar o item LGPD.'),
    });

    const deleteLgpd = async (row: ProjetoSoftwareDadoLgpd) => {
        await confirmDialog({
            title: 'Excluir item LGPD?',
            content: `Remover “${row.categoria_dado}”?`,
            okText: 'Excluir',
            okType: 'danger',
            onOk: async () => {
                try {
                    await apiClient.delete(API_ENDPOINTS.projetos.dadosLgpd.destroy(id, row.id));
                    message.success('Item excluído.');
                    await refetchLgpd();
                } catch (e) {
                    notifyApiError(e, 'Não foi possível excluir.');
                }
            },
        });
    };

    const openLgpd = (row?: ProjetoSoftwareDadoLgpd) => {
        setEditingLgpd(row ?? null);
        if (row) {
            lgpdForm.setFieldsValue(row);
        } else {
            lgpdForm.resetFields();
            lgpdForm.setFieldsValue({ dado_pessoal: true, dado_sensivel: false, ordem: 0 });
        }
        setLgpdModal(true);
    };

    return (
        <ProjetoLayout
            projetoId={id}
            pageTitle="Segurança tipológica"
            pageIcon="lock"
            titleSection="Segurança"
            breadcrumbItems={[
                { title: 'PROJETO' },
                { title: 'Projeto', path: `/projetos/${id}` },
                { title: 'Segurança tipológica' },
            ]}
            data-testid="projeto-seguranca-tipologica"
        >
            
            <Tabs
                items={[
                    {
                        key: 'perfil',
                        label: 'Perfil',
                        children: (
                            <Form
                                id={FORM_SEC}
                                form={secForm}
                                layout="vertical"
                                disabled={!canEditar}
                                onFinish={(v) => saveSec.mutate(v)}
                            >
                                <Row gutter={16}>
                                    <Col xs={24} md={12}>
                                        <Form.Item name="autenticacao_modelo" label="Modelo de autenticação">
                                            <Input placeholder="Ex.: Sanctum + sessão" />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={12}>
                                        <Form.Item name="autorizacao_modelo" label="Modelo de autorização">
                                            <Input placeholder="Ex.: policies + papéis" />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="mfa" label="MFA">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="politica_senha" label="Política de senha">
                                            <Input />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="sessao_timeout" label="Timeout de sessão">
                                            <Input placeholder="Ex.: 120 min" />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="criptografia_transito" label="Criptografia em trânsito">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="criptografia_repouso" label="Criptografia em repouso">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="secrets_gestao" label="Gestão de secrets">
                                            <Input placeholder="Ex.: vault / env por ambiente" />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="rate_limiting" label="Rate limiting">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="protecao_brute_force" label="Proteção brute force">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="csrf" label="CSRF">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={12}>
                                        <Form.Item name="cors" label="CORS">
                                            <Input />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={12}>
                                        <Form.Item name="headers_seguranca" label="Headers de segurança">
                                            <Input placeholder="Ex.: HSTS, CSP" />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item name="auditoria_logging" label="Auditoria / logging">
                                            <Select options={BOOL_OPTS} />
                                        </Form.Item>
                                    </Col>
                                    <Col xs={24} md={8}>
                                        <Form.Item
                                            name="confirmado_manual"
                                            label="Confirmado manualmente"
                                            valuePropName="checked"
                                        >
                                            <Switch />
                                        </Form.Item>
                                    </Col>
                                    <Col span={24}>
                                        <Form.Item name="vulnerabilidades_conhecidas" label="Vulnerabilidades conhecidas">
                                            <FormTextarea rows={3} />
                                        </Form.Item>
                                    </Col>
                                    <Col span={24}>
                                        <Form.Item name="observacoes" label="Observações">
                                            <FormTextarea rows={2} />
                                        </Form.Item>
                                    </Col>
                                </Row>
                                <Tooltip title={tooltipSemEdicao}>
                                    <Button
                                        type="primary"
                                        htmlType="submit"
                                        icon={<Save size={ICON_SIZE_MD} />}
                                        loading={saveSec.isPending || loadingSec}
                                        disabled={!canEditar}
                                    >
                                        Salvar perfil
                                    </Button>
                                </Tooltip>
                            </Form>
                        ),
                    },
                    {
                        key: 'lgpd',
                        label: 'LGPD',
                        children: (
                            <>
                                {dadosLgpd.length === 0 && !loadingLgpd ? (
                                    <ProjetoTipologicoEmptyState
                                        title="Nenhum item LGPD"
                                        domainKey="dadosLgpd"
                                        projetoId={id}
                                        primaryAction={
                                            canEditar ? (
                                                <Button type="primary" onClick={() => openLgpd()}>
                                                    Adicionar item
                                                </Button>
                                            ) : undefined
                                        }
                                    />
                                ) : (
                                    <LazyDataTable
                                        rowKey="id"
                                        loading={loadingLgpd}
                                        data={dadosLgpd}
                                        pagination={false}
                                        columns={[
                                            { title: 'Categoria', dataIndex: 'categoria_dado' },
                                            {
                                                title: 'Sensível',
                                                dataIndex: 'dado_sensivel',
                                                render: (v: boolean) => (v ? 'Sim' : 'Não'),
                                            },
                                            { title: 'Base legal', dataIndex: 'base_legal' },
                                            { title: 'Retenção', dataIndex: 'retencao' },
                                            { title: 'Papel', dataIndex: 'papel' },
                                            {
                                                title: 'Ações',
                                                key: 'acoes',
                                                render: (_: unknown, row: ProjetoSoftwareDadoLgpd) => (
                                                    <Space>
                                                        <Button size="small" disabled={!canEditar} onClick={() => openLgpd(row)}>
                                                            Editar
                                                        </Button>
                                                        <Button
                                                            size="small"
                                                            danger
                                                            disabled={!canEditar}
                                                            onClick={() => deleteLgpd(row)}
                                                        >
                                                            Excluir
                                                        </Button>
                                                    </Space>
                                                ),
                                            },
                                        ]}
                                        ariaRegionLabel="Controles de segurança do projeto"
                                        autoMobileFromColumns={{
                                            testIdPrefix: 'software-seguranca-lgpd',
                                            listHeading: 'Dados LGPD',
                                            getFallbackTitle: (r) =>
                                                r.categoria_dado?.trim() || `Item LGPD ${r.id}`,
                                        }}
                                    />
                                )}
                                {canEditar ? (
                                    <ListPageCreateFloatButton
                                        icon={<Plus size={ICON_SIZE_MD} aria-hidden />}
                                        onClick={() => openLgpd()}
                                        aria-label="Adicionar item LGPD"
                                    />
                                ) : null}
                            </>
                        ),
                    },
                ]}
            />
            

            <Modal
                {...formModalLayout}
                title={editingLgpd ? 'Editar item LGPD' : 'Novo item LGPD'}
                open={lgpdModal}
                onCancel={() => {
                    setLgpdModal(false);
                    setEditingLgpd(null);
                }}
                footer={
                    <div className={waygestFormModalFooterClassName}>
                        <Button onClick={() => setLgpdModal(false)}>Cancelar</Button>
                        <Button
                            type="primary"
                            form={FORM_LGPD}
                            htmlType="submit"
                            loading={saveLgpd.isPending}
                            disabled={!canEditar}
                        >
                            Salvar
                        </Button>
                    </div>
                }
            >
                <Form
                    id={FORM_LGPD}
                    form={lgpdForm}
                    layout="vertical"
                    onFinish={(v) => saveLgpd.mutate(v)}
                    scrollToFirstError
                >
                    <Form.Item name="categoria_dado" label="Categoria do dado" rules={[{ required: true }]}>
                        <Input />
                    </Form.Item>
                    <Form.Item name="dado_pessoal" label="Dado pessoal" valuePropName="checked">
                        <Switch />
                    </Form.Item>
                    <Form.Item name="dado_sensivel" label="Dado sensível" valuePropName="checked">
                        <Switch />
                    </Form.Item>
                    <Form.Item name="finalidade" label="Finalidade">
                        <FormTextarea rows={2} />
                    </Form.Item>
                    <Form.Item name="base_legal" label="Base legal">
                        <Input />
                    </Form.Item>
                    <Form.Item name="retencao" label="Retenção">
                        <Input />
                    </Form.Item>
                    <Form.Item name="papel" label="Papel">
                        <Select
                            allowClear
                            options={[
                                { label: 'Controlador', value: 'controlador' },
                                { label: 'Operador', value: 'operador' },
                            ]}
                        />
                    </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>
    );
}
