"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deletePlano = exports.changeImagem = exports.editPlano = exports.getPlano = exports.getPlanos = exports.createPlano = 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 Plano
const createPlano = async (req, res, next) => {
    try {
        let { designacao, customField, descricao, valor, userId, emolumentoId } = 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 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 foundPlano = await prisma_1.prisma.plano.findFirst({
            where: { designacao },
        });
        if (foundPlano) {
            const error = new Error('Plano já existe');
            error.statusCode = 422;
            throw error;
        }
        const data = {
            designacao,
            valor: Number(valor),
            adminId: Number(userId),
            emolumentoId: emolumento.id,
            customField
        };
        if (descricao) {
            data.descricao = descricao;
        }
        // Upload das imagens
        if (imagem) {
            imagem.filename = (0, upload_1.generateFileName)(imagem);
            data.imagem = imagem.filename;
            await (0, aws_1.uploadFile)(imagem);
        }
        const newPlano = await prisma_1.prisma.plano.create({ data });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)(`Adicionou plano '${newPlano.designacao}'`, 'Plano', newPlano.id, user);
        res.status(201).json({ msg: 'Sucesso', plano: newPlano });
    }
    catch (err) {
        next(err);
    }
};
exports.createPlano = createPlano;
// Controller Para pegar todos os Planos
const getPlanos = async (req, res, next) => {
    try {
        const { model, tipo, emolumentoId, deleted } = req.query;
        const page = (0, pagination_1.getPage)(req.query.page);
        let paramPerPage = req.query.perPage;
        let perPage = 50;
        if (paramPerPage) {
            perPage = +paramPerPage;
        }
        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(emolumentoId)) {
            filterObject.emolumentoId = Number(emolumentoId);
        }
        if (Boolean(deleted) && JSON.parse(deleted)) {
            filterObject.deletedAt = { not: null };
            setOptions.deleted = true;
        }
        const planos = await prisma_1.prisma.plano.findMany({
            where: filterObject,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
        });
        for (let plano of planos) {
            if (plano.imagem) {
                plano.imagem = await (0, aws_1.getURL)(plano.imagem);
            }
        }
        res.status(200).json({ msg: 'Sucesso', planos });
    }
    catch (err) {
        next(err);
    }
};
exports.getPlanos = getPlanos;
// Controller que pega um único Plano
const getPlano = async (req, res, next) => {
    try {
        const { id } = req.params;
        const plano = await prisma_1.prisma.plano.findUnique({
            where: { id: Number(id) },
            include: { admin: true },
        });
        if (!plano) {
            const error = new Error('Plano não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (plano.imagem) {
            plano.imagem = await (0, aws_1.getURL)(plano.imagem);
        }
        res.status(200).json({ msg: 'Sucesso', plano });
    }
    catch (err) {
        next(err);
    }
};
exports.getPlano = getPlano;
// Controller para editar plano
const editPlano = async (req, res, next) => {
    try {
        const { planoId, designacao, valor, descricao, emolumentoId, customField, 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 plano = await prisma_1.prisma.plano.findUnique({
            where: { id: Number(planoId) },
        });
        if (!plano) {
            const error = new Error('Plano 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(emolumentoId)) {
            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;
            }
            updateData.emolumentoId = emolumento.id;
        }
        if (Boolean(customField)) {
            updateData.customField = customField;
        }
        const updatedPlano = await prisma_1.prisma.plano.update({
            where: { id: Number(planoId) },
            data: updateData,
        });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Editou plano', 'Plano', updatedPlano.id, admin);
        res.status(201).json({ msg: 'Sucesso', plano: updatedPlano });
    }
    catch (err) {
        next(err);
    }
};
exports.editPlano = editPlano;
const changeImagem = async (req, res, next) => {
    try {
        const { planoId, 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 plano = await prisma_1.prisma.plano.findUnique({
            where: { id: Number(planoId) },
        });
        if (!plano) {
            const error = new Error('Plano não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        // Se tiver uma imagem apaga do S3
        if (plano.imagem) {
            await (0, aws_1.deleteFile)(plano.imagem);
        }
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        const data = { imagem: imagem.filename };
        const updatedPlano = await prisma_1.prisma.plano.update({
            where: { id: Number(planoId) },
            data: data,
        });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Alterou a imagem do plano', 'Plano', updatedPlano.id, admin);
        res.status(201).json({ msg: 'Sucesso', plano: updatedPlano });
    }
    catch (err) {
        next(err);
    }
};
exports.changeImagem = changeImagem;
// Controller para deletar plano
const deletePlano = 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 plano = await prisma_1.prisma.plano.findUnique({
            where: { id: Number(id) },
        });
        if (!plano) {
            const error = new Error('Plano não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.plano.delete({ where: { id: Number(id) } });
        // Cria historico de actividade
        await (0, main_1.createHistoricoActividade)('Deletou plano', 'Plano', plano.id, admin);
        res.status(204).json({ msg: 'Deletado com sucesso!' });
    }
    catch (err) {
        next(err);
    }
};
exports.deletePlano = deletePlano;
