"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteNoticia = exports.changeAnexo = exports.changeImage = exports.editNoticia = exports.getNoticia = exports.getNoticias = exports.createNoticia = void 0;
const express_validator_1 = require("express-validator");
const upload_1 = require("../../middleware/upload");
const aws_1 = require("../../services/aws");
const main_1 = require("../../util/main");
const pagination_1 = require("../../util/pagination");
const prisma_1 = require("../../database/prisma");
// Controller para criar noticia
const createNoticia = async (req, res, next) => {
    try {
        const { imagem, anexo } = req.files;
        let { titulo, subTitulo, fonte, link, conteudo, destaque, seccao, categoria, userId, status, } = 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;
        }
        if (!imagem) {
            const error = new Error('Faça o upload do 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;
        }
        imagem[0].filename = (0, upload_1.generateFileName)(imagem[0]);
        const noticiaData = {
            titulo,
            conteudo,
            imagem: imagem[0].filename,
            adminId: Number(userId),
        };
        if (Boolean(subTitulo)) {
            noticiaData.subTitulo = subTitulo;
        }
        if (Boolean(link)) {
            noticiaData.link = link;
        }
        if (Boolean(fonte)) {
            noticiaData.fonte = fonte;
        }
        if (Boolean(categoria)) {
            noticiaData.categoria = categoria;
        }
        if (Boolean(seccao)) {
            noticiaData.seccao = seccao;
        }
        if (Boolean(status)) {
            noticiaData.status = status;
        }
        if (Boolean(destaque)) {
            destaque = JSON.parse(destaque);
            noticiaData.destaque = destaque;
            const noticiasEmDestaque = await prisma_1.prisma.noticia.findMany({ where: { destaque: destaque } });
            for (let noticia of noticiasEmDestaque) {
                await prisma_1.prisma.noticia.update({ where: { id: noticia.id }, data: { destaque: false } });
            }
        }
        const noticia = await prisma_1.prisma.noticia.create({ data: noticiaData });
        if (anexo) {
            anexo[0].filename = (0, upload_1.generateFileName)(anexo[0]);
            await (0, aws_1.uploadFile)(anexo[0]);
            await prisma_1.prisma.noticia.update({ where: { id: noticia.id }, data: { anexo: anexo[0].filename } });
        }
        await (0, aws_1.uploadFile)(imagem[0]);
        // HistoricoActividade
        await (0, main_1.createHistoricoActividade)(`Criou notícia`, 'Noticia', noticia.id, admin);
        const noticiaWithURL = { ...noticia };
        if (noticia.imagem) {
            noticiaWithURL.imagem = await (0, aws_1.getURL)(noticia.imagem);
        }
        if (noticia.anexo) {
            noticiaWithURL.anexo = await (0, aws_1.getURL)(noticia.anexo);
        }
        res.status(201).json({ msg: 'Sucesso', noticia: noticiaWithURL });
    }
    catch (err) {
        next(err);
    }
};
exports.createNoticia = createNoticia;
// Metodo que busca todas as noticias
const getNoticias = async (req, res, next) => {
    try {
        const { status, seccao } = 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(seccao)) {
            filterObj.seccao = seccao;
        }
        const total = await prisma_1.prisma.noticia.count({ where: filterObj });
        const noticias = await prisma_1.prisma.noticia.findMany({
            where: filterObj,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
        });
        for (const noticia of noticias) {
            if (noticia.imagem) {
                noticia.imagem = await (0, aws_1.getURL)(noticia.imagem);
            }
            if (noticia.anexo) {
                noticia.anexo = await (0, aws_1.getURL)(noticia.anexo);
            }
        }
        res.status(200).json({
            msg: 'Sucesso',
            noticias,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getNoticias = getNoticias;
// Metodo que busca pelo id noticia
const getNoticia = async (req, res, next) => {
    try {
        const { id } = req.params;
        const noticia = await prisma_1.prisma.noticia.findUnique({ where: { id: Number(id) } });
        if (!noticia) {
            const error = new Error('Notícia não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if (noticia.imagem) {
            noticia.imagem = await (0, aws_1.getURL)(noticia.imagem);
        }
        if (noticia.anexo) {
            noticia.anexo = await (0, aws_1.getURL)(noticia.anexo);
        }
        res.status(200).json({
            msg: 'Sucesso',
            noticia,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getNoticia = getNoticia;
// Controller para editar noticia
const editNoticia = async (req, res, next) => {
    try {
        let { titulo, subTitulo, fonte, link, conteudo, seccao, categoria, destaque, userId, noticiaId, status, } = 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 noticia = await prisma_1.prisma.noticia.findUnique({ where: { id: Number(noticiaId) } });
        if (!noticia) {
            const error = new Error('Notícia não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if (Boolean(titulo)) {
            noticia.titulo = titulo;
        }
        if (Boolean(fonte)) {
            noticia.fonte = fonte;
        }
        if (Boolean(link)) {
            noticia.link = link;
        }
        if (Boolean(seccao)) {
            noticia.seccao = seccao;
        }
        if (Boolean(conteudo)) {
            noticia.conteudo = conteudo;
        }
        if (Boolean(subTitulo)) {
            noticia.subTitulo = subTitulo;
        }
        if (Boolean(status)) {
            noticia.status = status;
        }
        if (Boolean(categoria)) {
            noticia.categoria = categoria;
        }
        const noticiaData = {};
        if (Boolean(titulo)) {
            noticiaData.titulo = titulo;
        }
        if (Boolean(fonte)) {
            noticiaData.fonte = fonte;
        }
        if (Boolean(link)) {
            noticiaData.link = link;
        }
        if (Boolean(seccao)) {
            noticiaData.seccao = seccao;
        }
        if (Boolean(conteudo)) {
            noticiaData.conteudo = conteudo;
        }
        if (Boolean(subTitulo)) {
            noticiaData.subTitulo = subTitulo;
        }
        if (Boolean(status)) {
            noticiaData.status = status;
        }
        if (Boolean(categoria)) {
            noticiaData.categoria = categoria;
        }
        if (Boolean(destaque)) {
            const atualDestaque = JSON.parse(destaque);
            const noticiasEmDestaque = await prisma_1.prisma.noticia.findMany({ where: { destaque: atualDestaque } });
            for (const noticiaItem of noticiasEmDestaque) {
                await prisma_1.prisma.noticia.update({
                    where: { id: noticiaItem.id },
                    data: { destaque: false },
                });
            }
            noticiaData.destaque = atualDestaque;
        }
        const updatedNoticia = await prisma_1.prisma.noticia.update({
            where: { id: Number(noticiaId) },
            data: noticiaData,
        });
        await (0, main_1.createHistoricoActividade)(`Editou noticia`, 'Noticia', noticia.id, admin);
        res.status(201).json({ msg: 'Sucesso', noticia: updatedNoticia });
    }
    catch (err) {
        next(err);
    }
};
exports.editNoticia = editNoticia;
const changeImage = async (req, res, next) => {
    try {
        const { noticiaId, userId } = req.body;
        const imagem = 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 (!imagem) {
            const error = new Error('Por favor fornceça uma imagem');
            error.statusCode = 422;
            throw error;
        }
        const noticia = await prisma_1.prisma.noticia.findUnique({ where: { id: Number(noticiaId) } });
        if (!noticia) {
            const error = new Error('Notícia não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        // Depois renomeia e faz o upload
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        await (0, aws_1.uploadFile)(imagem);
        const updatedNoticia = await prisma_1.prisma.noticia.update({
            where: { id: Number(noticiaId) },
            data: { imagem: imagem.filename },
        });
        // HistoricoActividade
        await (0, main_1.createHistoricoActividade)(`Alterou imagem da notícia`, 'Noticia', noticia.id, admin);
        const noticiaWithImage = { ...updatedNoticia };
        noticiaWithImage.imagem = await (0, aws_1.getURL)(updatedNoticia.imagem);
        res.status(201).json({
            msg: 'Sucesso!',
            noticia: noticiaWithImage,
        });
    }
    catch (error) {
        next(error);
    }
};
exports.changeImage = changeImage;
const changeAnexo = async (req, res, next) => {
    try {
        const { noticiaId, 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('Faça o upload da imagem!');
            error.statusCode = 422;
            throw error;
        }
        const noticia = await prisma_1.prisma.noticia.findUnique({ where: { id: Number(noticiaId) } });
        if (!noticia) {
            const error = new Error('Notícia não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        // Depois renomeia e faz o upload
        anexo.filename = (0, upload_1.generateFileName)(anexo);
        await (0, aws_1.uploadFile)(anexo);
        const updatedNoticia = await prisma_1.prisma.noticia.update({
            where: { id: Number(noticiaId) },
            data: { anexo: anexo.filename },
        });
        // HistoricoActividade
        await (0, main_1.createHistoricoActividade)(`Alterou anexo da notícia`, 'Noticia', noticia.id, admin);
        const noticiaWithAnexo = { ...updatedNoticia };
        if (updatedNoticia.anexo) {
            noticiaWithAnexo.anexo = await (0, aws_1.getURL)(updatedNoticia.anexo);
        }
        res.status(201).json({
            msg: 'Sucesso!',
            noticia: noticiaWithAnexo,
        });
    }
    catch (error) {
        next(error);
    }
};
exports.changeAnexo = changeAnexo;
const deleteNoticia = 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 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;
        }
        const noticia = await prisma_1.prisma.noticia.findUnique({ where: { id: Number(id) } });
        if (!noticia) {
            const error = new Error('Notícia não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.noticia.delete({ where: { id: noticia.id } });
        await (0, main_1.createHistoricoActividade)(`Deletou noticia: ${noticia.titulo}`, 'Noticia', noticia.id, user);
        res.status(204).json({ msg: 'Sucesso!' });
    }
    catch (err) {
        next(err);
    }
};
exports.deleteNoticia = deleteNoticia;
