"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDefinicoesSistema = exports.toggleDefinicoesSeccoes = exports.toggleDefinicoesServicos = exports.CreateDefinicoesSistema = void 0;
const express_validator_1 = require("express-validator");
const main_1 = require("../../util/main");
const prisma_1 = require("../../database/prisma");
const CreateDefinicoesSistema = async (req, res, next) => {
    try {
        const { descricao, userId } = req.body;
        const errors = (0, express_validator_1.validationResult)(req);
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        const admin = await prisma_1.prisma.user.findUnique({ where: { id: Number(userId) } });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const definicao = await prisma_1.prisma.definicao.create({
            data: { descricao },
        });
        await (0, main_1.createHistoricoActividade)(`Criou definicao`, 'Definicao', definicao.id, admin);
        res.status(201).json({ msg: 'Sucesso', definicao });
    }
    catch (err) {
        next(err);
    }
};
exports.CreateDefinicoesSistema = CreateDefinicoesSistema;
const toggleDefinicoesServicos = async (req, res, next) => {
    try {
        const { definicao, userId, observacao } = req.body;
        const errors = (0, express_validator_1.validationResult)(req);
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        const admin = await prisma_1.prisma.user.findFirst({
            where: { id: Number(userId), isAdmin: true },
            include: { dadosPessoais: true },
        });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const definicaos = await prisma_1.prisma.definicao.findUnique({ where: { id: Number(definicao) } });
        if (!definicaos) {
            const error = new Error('Definição não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        const servicos = Array.isArray(definicaos.servicos)
            ? definicaos.servicos
            : [];
        let updatedServicos = servicos;
        let message = '';
        if (servicos.includes(definicao)) {
            updatedServicos = servicos.filter((p) => p !== definicao);
            message = `Removeu definição de sistema '${definicao}'`;
        }
        else {
            updatedServicos = [...servicos, definicao];
            message = `Atribuiu definição de sistema '${definicao}'`;
        }
        const updatedDefinicao = await prisma_1.prisma.definicao.update({
            where: { id: definicaos.id },
            data: { servicos: updatedServicos },
        });
        await (0, main_1.createHistoricoActividade)(message, 'Admin', admin.id, admin, observacao);
        res.status(201).json({
            msg: 'Sucesso',
            definicaos: updatedDefinicao,
            definicoesSistema: updatedDefinicao,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.toggleDefinicoesServicos = toggleDefinicoesServicos;
const toggleDefinicoesSeccoes = async (req, res, next) => {
    try {
        const { definicao, userId, observacao } = req.body;
        const errors = (0, express_validator_1.validationResult)(req);
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        const admin = await prisma_1.prisma.user.findFirst({
            where: { id: Number(userId), isAdmin: true },
            include: { dadosPessoais: true },
        });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const definicaos = await prisma_1.prisma.definicao.findFirst();
        if (!definicaos) {
            const error = new Error('Definição não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        const seccoes = Array.isArray(definicaos.seccoes)
            ? definicaos.seccoes
            : [];
        let updatedSeccoes = seccoes;
        let message = '';
        if (seccoes.includes(definicao)) {
            updatedSeccoes = seccoes.filter((p) => p !== definicao);
            message = `Removeu definição de sistema '${definicao}'`;
        }
        else {
            updatedSeccoes = [...seccoes, definicao];
            message = `Atribuiu definição de sistema '${definicao}'`;
        }
        const updatedDefinicao = await prisma_1.prisma.definicao.update({
            where: { id: definicaos.id },
            data: { seccoes: updatedSeccoes },
        });
        await (0, main_1.createHistoricoActividade)(message, 'Admin', updatedDefinicao.id, admin, observacao);
        res.status(201).json({
            msg: 'Sucesso',
            definicaos: updatedDefinicao,
            definicoesSistema: updatedDefinicao,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.toggleDefinicoesSeccoes = toggleDefinicoesSeccoes;
const getDefinicoesSistema = async (req, res, next) => {
    try {
        const definicoesSistema = await prisma_1.prisma.definicao.findMany();
        res.status(200).json({
            msg: 'Sucesso',
            definicoesSistema,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getDefinicoesSistema = getDefinicoesSistema;
