"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteEmolumento = exports.editEmolumento = exports.getEmolumento = exports.getEmolumentos = exports.createEmolumento = void 0;
const express_validator_1 = require("express-validator");
const main_1 = require("../../util/main");
const prisma_1 = require("../../database/prisma");
// Controller Para registar Emolumento
const createEmolumento = async (req, res, next) => {
    try {
        let { designacao, valor, tipo, isPublic, userId, model } = 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 user = await prisma_1.prisma.user.findUnique({
            where: { id: Number(userId) },
        });
        if (!user) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const foundEmolumento = await prisma_1.prisma.emolumento.findFirst({
            where: { designacao },
        });
        if (foundEmolumento) {
            const error = new Error('Emolumento já existe');
            error.statusCode = 422;
            throw error;
        }
        if (Boolean(model)) {
            model = (0, main_1.capitalizeFirstCharacter)(model);
        }
        const data = {
            designacao,
            valor: Number(valor),
            model,
            tipo,
            adminId: Number(userId),
        };
        if (typeof isPublic !== 'undefined' && isPublic !== null) {
            data.isPublic =
                typeof isPublic === 'string'
                    ? JSON.parse(isPublic)
                    : Boolean(isPublic);
        }
        const newEmolumento = await prisma_1.prisma.emolumento.create({ data });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)(`Cadastrou emolumento '${newEmolumento.designacao}'`, 'Emolumento', newEmolumento.id, user);
        res
            .status(201)
            .json({ msg: 'Sucesso', emolumento: newEmolumento });
    }
    catch (err) {
        next(err);
    }
};
exports.createEmolumento = createEmolumento;
// Controller Para pegar todos os Emolumentos
const getEmolumentos = async (req, res, next) => {
    try {
        const { model, tipo, deleted } = req.query;
        let direccao = Array.isArray(req.query.direccao)
            ? req.query.direccao[0]
            : req.query.direccao;
        direccao = typeof direccao === 'string' ? direccao : '';
        const filterObject = {};
        // Object que define se vai apresentar os deletados
        let setOptions = { deleted: false };
        if (Boolean(model)) {
            filterObject.model = model;
        }
        if (Boolean(tipo)) {
            filterObject.tipo = tipo;
        }
        if (Boolean(deleted) && JSON.parse(deleted)) {
            filterObject.deletedAt = { not: null };
            setOptions.deleted = true;
        }
        const emolumentos = await prisma_1.prisma.emolumento.findMany({ where: filterObject });
        res.status(200).json({ msg: 'Sucesso', emolumentos });
    }
    catch (err) {
        next(err);
    }
};
exports.getEmolumentos = getEmolumentos;
// Controller que pega um único Emolumento
const getEmolumento = async (req, res, next) => {
    try {
        const { id } = req.params;
        const emolumento = await prisma_1.prisma.emolumento.findUnique({
            where: { id: Number(id) },
        });
        res.status(200).json({ msg: 'Sucesso', emolumento });
    }
    catch (err) {
        next(err);
    }
};
exports.getEmolumento = getEmolumento;
// Controller para editar emolumento
const editEmolumento = async (req, res, next) => {
    try {
        const { emolumentoId, designacao, valor, tipo, isPublic, model, 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 emolumento = await prisma_1.prisma.emolumento.findUnique({
            where: { id: Number(emolumentoId) },
        });
        if (!emolumento) {
            const error = new Error('Emolumento não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (Boolean(designacao)) {
            emolumento.designacao = designacao;
        }
        if (valor !== undefined && valor !== null && String(valor).trim() !== '') {
            emolumento.valor = Number(valor);
        }
        if (Boolean(tipo)) {
            emolumento.tipo = tipo;
        }
        if (Boolean(model)) {
            emolumento.model = (0, main_1.capitalizeFirstCharacter)(model);
        }
        const updateData = {};
        if (Boolean(designacao))
            updateData.designacao = designacao;
        if (valor !== undefined && valor !== null && String(valor).trim() !== '')
            updateData.valor = Number(valor);
        if (Boolean(tipo))
            updateData.tipo = tipo;
        if (Boolean(model))
            updateData.model = (0, main_1.capitalizeFirstCharacter)(model);
        if (typeof isPublic !== 'undefined' && isPublic !== null) {
            updateData.isPublic =
                typeof isPublic === 'string'
                    ? JSON.parse(isPublic)
                    : Boolean(isPublic);
        }
        const updatedEmolumento = await prisma_1.prisma.emolumento.update({
            where: { id: Number(emolumentoId) },
            data: updateData,
        });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Editou emolumento', 'Emolumento', updatedEmolumento.id, admin);
        res.status(201).json({ msg: 'Sucesso', emolumento: updatedEmolumento });
    }
    catch (err) {
        next(err);
    }
};
exports.editEmolumento = editEmolumento;
// Controller para deletar emolumento
const deleteEmolumento = async (req, res, next) => {
    try {
        const { emolumentoId, 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 emolumento = await prisma_1.prisma.emolumento.findUnique({
            where: { id: Number(emolumentoId) },
        });
        if (!emolumento) {
            const error = new Error('Emolumento não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.emolumento.delete({ where: { id: Number(emolumentoId) } });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Deletou emolumento', 'Emolumento', emolumento.id, admin);
        res.status(204).json({ msg: 'Deletado com sucesso!' });
    }
    catch (err) {
        next(err);
    }
};
exports.deleteEmolumento = deleteEmolumento;
