"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteSiteInfo = exports.changeImage = exports.editSiteInfo = exports.getSiteInfo = exports.getSiteInfos = exports.createSiteInfo = void 0;
const express_validator_1 = require("express-validator");
const upload_1 = require("../../middleware/upload");
const aws_1 = require("../../services/aws");
const prisma_1 = require("../../database/prisma");
const pagination_1 = require("../../util/pagination");
const main_1 = require("../../util/main");
const createSiteInfo = async (req, res, next) => {
    try {
        let { menu, opcao, titulo, tipoFile, conteudo, userId } = req.body;
        const anexo = req.file;
        const errors = (0, express_validator_1.validationResult)(req);
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        if (menu === 'legislacao e documentos' && !tipoFile) {
            const error = new Error('Seleciona o tipo de documento');
            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 data = {
            menu,
            opcao,
            titulo,
            tipoFile: tipoFile !== null && tipoFile !== void 0 ? tipoFile : null,
            conteudo,
            adminId: Number(userId),
        };
        if (anexo) {
            anexo.filename = (0, upload_1.generateFileName)(anexo);
            data.anexo = anexo.filename;
            await (0, aws_1.uploadFile)(anexo);
        }
        const siteInfo = await prisma_1.prisma.siteInfo.create({ data });
        await (0, main_1.createHistoricoActividade)(`Criou siteInfo`, 'SiteInfo', siteInfo.id, admin);
        if (siteInfo.anexo) {
            siteInfo.anexo = await (0, aws_1.getURL)(siteInfo.anexo);
        }
        res.status(201).json({ msg: 'Sucesso', siteInfo });
    }
    catch (err) {
        next(err);
    }
};
exports.createSiteInfo = createSiteInfo;
const getSiteInfos = async (req, res, next) => {
    try {
        const { status, menu, opcao, tipoFile } = req.query;
        const filterObj = {};
        const page = (0, pagination_1.getPage)(req.query.page);
        let paramPerPage = req.query.perPage;
        let perPage = 50;
        if (paramPerPage) {
            perPage = +paramPerPage;
        }
        if (Boolean(status))
            filterObj.status = status;
        if (Boolean(menu))
            filterObj.menu = menu;
        if (Boolean(opcao))
            filterObj.opcao = opcao;
        if (Boolean(tipoFile))
            filterObj.tipoFile = tipoFile;
        const total = await prisma_1.prisma.siteInfo.count({ where: filterObj });
        const siteInfos = await prisma_1.prisma.siteInfo.findMany({
            where: filterObj,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
        });
        for (const siteInfo of siteInfos) {
            if (siteInfo.anexo) {
                siteInfo.anexo = await (0, aws_1.getURL)(siteInfo.anexo);
            }
        }
        res.status(200).json({
            msg: 'Sucesso',
            siteInfos,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getSiteInfos = getSiteInfos;
const getSiteInfo = async (req, res, next) => {
    var _a, _b;
    try {
        const { id } = req.params;
        const siteInfo = await prisma_1.prisma.siteInfo.findUnique({
            where: { id: Number(id) },
            include: { admin: { include: { dadosPessoais: true } } },
        });
        if (!siteInfo) {
            const error = new Error('SiteInfo não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if (siteInfo.anexo) {
            siteInfo.anexo = await (0, aws_1.getURL)(siteInfo.anexo);
        }
        if ((_b = (_a = siteInfo.admin) === null || _a === void 0 ? void 0 : _a.dadosPessoais) === null || _b === void 0 ? void 0 : _b.fotoURL) {
            siteInfo.admin.dadosPessoais.fotoURL = await (0, aws_1.getURL)(siteInfo.admin.dadosPessoais.fotoURL);
        }
        res.status(200).json({ msg: 'Sucesso', siteInfo });
    }
    catch (err) {
        next(err);
    }
};
exports.getSiteInfo = getSiteInfo;
const editSiteInfo = async (req, res, next) => {
    try {
        let { siteInfoId, menu, opcao, titulo, tipoFile, conteudo, status, 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 siteInfo = await prisma_1.prisma.siteInfo.findUnique({ where: { id: Number(siteInfoId) } });
        if (!siteInfo) {
            const error = new Error('SiteInfo não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        const updateData = {};
        if (menu)
            updateData.menu = menu;
        if (opcao)
            updateData.opcao = opcao;
        if (titulo)
            updateData.titulo = titulo;
        if (tipoFile)
            updateData.tipoFile = tipoFile;
        if (conteudo)
            updateData.conteudo = conteudo;
        if (status)
            updateData.status = status;
        const updatedSiteInfo = await prisma_1.prisma.siteInfo.update({
            where: { id: Number(siteInfoId) },
            data: updateData,
        });
        await (0, main_1.createHistoricoActividade)(`Editou siteInfo`, 'SiteInfo', updatedSiteInfo.id, admin);
        const resolvedAnexo = updatedSiteInfo.anexo ? await (0, aws_1.getURL)(updatedSiteInfo.anexo) : null;
        if (resolvedAnexo) {
            updatedSiteInfo.anexo = resolvedAnexo;
        }
        res.status(201).json({ msg: 'Sucesso', siteInfo: updatedSiteInfo });
    }
    catch (err) {
        next(err);
    }
};
exports.editSiteInfo = editSiteInfo;
const changeImage = async (req, res, next) => {
    try {
        const { siteInfoId, userId } = req.body;
        const anexo = req.file;
        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;
        }
        if (!anexo) {
            const error = new Error('Por favor fornceça uma anexo');
            error.statusCode = 422;
            throw error;
        }
        const siteInfo = await prisma_1.prisma.siteInfo.findUnique({ where: { id: Number(siteInfoId) } });
        if (!siteInfo) {
            const error = new Error('SiteInfo não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if (siteInfo.anexo) {
            await (0, aws_1.deleteFile)(siteInfo.anexo);
        }
        anexo.filename = (0, upload_1.generateFileName)(anexo);
        await (0, aws_1.uploadFile)(anexo);
        const updatedSiteInfo = await prisma_1.prisma.siteInfo.update({
            where: { id: Number(siteInfoId) },
            data: { anexo: anexo.filename },
        });
        await (0, main_1.createHistoricoActividade)(`Alterou anexo do siteInfo`, 'SiteInfo', updatedSiteInfo.id, admin);
        const resolvedAnexo = updatedSiteInfo.anexo ? await (0, aws_1.getURL)(updatedSiteInfo.anexo) : null;
        if (resolvedAnexo) {
            updatedSiteInfo.anexo = resolvedAnexo;
        }
        res.status(201).json({ msg: 'Sucesso!', siteInfo: updatedSiteInfo });
    }
    catch (error) {
        next(error);
    }
};
exports.changeImage = changeImage;
const deleteSiteInfo = async (req, res, next) => {
    try {
        const { siteInfoId, 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 user = await prisma_1.prisma.user.findFirst({
            where: { id: Number(userId), isAdmin: true },
        });
        if (!user) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.siteInfo.delete({ where: { id: Number(siteInfoId) } });
        await (0, main_1.createHistoricoActividade)(`Deletou siteInfo`, 'SiteInfo', Number(siteInfoId), user);
        res.status(204).json({ msg: 'Sucesso!' });
    }
    catch (err) {
        next(err);
    }
};
exports.deleteSiteInfo = deleteSiteInfo;
