"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteEmolumento = exports.changeImagem = 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");
const upload_1 = require("../../middleware/upload");
const aws_1 = require("../../services/aws");
const pagination_1 = require("../../util/pagination");
// Controller Para registar Emolumento
const createEmolumento = async (req, res, next) => {
    try {
        let { designacao, descricao, customField, valor, tipo, isPublic, userId, model, valorMinimo, prazoEmMesesMinimo, prazoEmMeses, taxaJuro, comissaoRisco, } = req.body;
        const imagem = req.file;
        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),
            customField,
        };
        if (Boolean(descricao)) {
            data.descricao = descricao;
        }
        if (Boolean(valorMinimo)) {
            data.valorMinimo = Number(valorMinimo);
        }
        if (Boolean(prazoEmMesesMinimo)) {
            data.prazoEmMesesMinimo = Number(prazoEmMesesMinimo);
        }
        if (Boolean(prazoEmMeses)) {
            data.prazoEmMeses = Number(prazoEmMeses);
        }
        if (Boolean(taxaJuro)) {
            data.taxaJuro = Number(taxaJuro);
        }
        if (Boolean(comissaoRisco)) {
            data.comissaoRisco = Number(comissaoRisco);
        }
        // Upload das imagens
        if (imagem) {
            imagem.filename = (0, upload_1.generateFileName)(imagem);
            data.imagem = imagem.filename;
            await (0, aws_1.uploadFile)(imagem);
        }
        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, status, deleted } = req.query;
        const page = (0, pagination_1.getPage)(req.query.page);
        let paramPerPage = req.query.perPage;
        let perPage = 50;
        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(status)) {
            filterObject.status = status;
        }
        if (Boolean(deleted) && JSON.parse(deleted)) {
            filterObject.deletedAt = { not: null };
            setOptions.deleted = true;
        }
        const emolumentos = await prisma_1.prisma.emolumento.findMany({
            where: filterObject,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
        });
        for (let emolumento of emolumentos) {
            if (emolumento.imagem) {
                emolumento.imagem = await (0, aws_1.getURL)(emolumento.imagem);
            }
        }
        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) },
        });
        if (!emolumento) {
            const error = new Error('Emolumento não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (emolumento.imagem) {
            emolumento.imagem = await (0, aws_1.getURL)(emolumento.imagem);
        }
        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, descricao, valor, tipo, isPublic, model, customField, valorMinimo, prazoEmMesesMinimo, prazoEmMeses, taxaJuro, comissaoRisco, 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;
        }
        const updateData = {};
        if (Boolean(designacao))
            updateData.designacao = designacao;
        if (Boolean(descricao))
            updateData.descricao = descricao;
        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);
        }
        if (Boolean(customField)) {
            updateData.customField = customField;
        }
        if (Boolean(valorMinimo)) {
            updateData.valorMinimo = Number(valorMinimo);
        }
        if (Boolean(prazoEmMesesMinimo)) {
            updateData.prazoEmMesesMinimo = Number(prazoEmMesesMinimo);
        }
        if (Boolean(prazoEmMeses)) {
            updateData.prazoEmMeses = Number(prazoEmMeses);
        }
        if (Boolean(taxaJuro)) {
            updateData.taxaJuro = Number(taxaJuro);
        }
        if (Boolean(comissaoRisco)) {
            updateData.comissaoRisco = Number(comissaoRisco);
        }
        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;
const changeImagem = async (req, res, next) => {
    try {
        const { emolumentoId, userId } = req.body;
        const imagem = req.file;
        if (!imagem) {
            const error = new Error('Por favor carregue uma imagem!');
            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;
        }
        // Se tiver uma imagem apaga do S3
        if (emolumento.imagem) {
            await (0, aws_1.deleteFile)(emolumento.imagem);
        }
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        const data = { imagem: imagem.filename };
        const updatedEmolumento = await prisma_1.prisma.emolumento.update({
            where: { id: Number(emolumentoId) },
            data: data,
        });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Alterou a imagem do emolumento', 'Emolumento', updatedEmolumento.id, admin);
        // upload imagem
        await (0, aws_1.uploadFile)(imagem);
        res.status(201).json({ msg: 'Sucesso', emolumento: updatedEmolumento });
    }
    catch (err) {
        next(err);
    }
};
exports.changeImagem = changeImagem;
// Controller para deletar emolumento
const deleteEmolumento = async (req, res, next) => {
    try {
        const { id, 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(id) },
        });
        if (!emolumento) {
            const error = new Error('Emolumento não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.emolumento.delete({ where: { id: Number(id) } });
        // 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;
