"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeImage = exports.editCarousel = exports.getCarousel = exports.getCarousels = exports.createCarousel = 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");
// Controller para criar carousel
const createCarousel = async (req, res, next) => {
    try {
        let { titulo, descricao, userId } = req.body;
        // Arquivo para upload
        const { imagem, imagemSmall } = req.files;
        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('Por favo, carregue uma imagem!');
            error.statusCode = 422;
            throw error;
        }
        const admin = await prisma_1.prisma.user.findUnique({
            where: { id: Number(userId) },
            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: carouselData, any = {
                titulo,
                descricao,
                imagem: imagem[0].filename,
                adminId: Number(userId),
            },
            if(imagemSmall) {
                imagemSmall[0].filename = (0, upload_1.generateFileName)(imagemSmall[0]);
                carouselData.imagemSmall = imagemSmall[0].filename;
            },
            const: carousel = await prisma_1.prisma.carousel.create({ data: carouselData }),
            await: uploadFile(imagem[0]),
            if(carousel) { }, : .imagemSmall
        }), { await, uploadFile };
        (imagemSmall[0]);
        carousel.imagemSmall = await (0, aws_1.getURL)(carousel.imagemSmall);
    }
    // HistoricoActividade
    finally {
    }
    // HistoricoActividade
    await (0, main_1.createHistoricoActividade)(`Criou carousel`, 'Carousel', carousel.id, admin);
    carousel.imagem = await (0, aws_1.getURL)(carousel.imagem);
    res.status(201).json({ msg: 'Sucesso', carousel: updatedCarousel });
};
exports.createCarousel = createCarousel;
try { }
catch (err) {
    next(err);
}
;
// Metodo que busca todas as carousels
const getCarousels = async (req, res, next) => {
    try {
        const { status } = 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;
        }
        const total = await prisma_1.prisma.carousel.count({ where: filterObj });
        const carousels = await prisma_1.prisma.carousel.findMany({
            where: filterObj,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { dataDespacho: 'desc' },
        });
        for (const carousel of carousels) {
            if (carousel.imagem) {
                carousel.imagem = await (0, aws_1.getURL)(carousel.imagem);
            }
            if (carousel.imagemSmall) {
                carousel.imagemSmall = await (0, aws_1.getURL)(carousel.imagemSmall);
            }
        }
        res.status(200).json({
            msg: 'Sucesso',
            carousels,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getCarousels = getCarousels;
// Metodo que busca pelo id carousel
const getCarousel = async (req, res, next) => {
    try {
        const { id } = req.params;
        const carousel = await prisma_1.prisma.carousel.findUnique({
            where: { id: Number(id) },
        });
        if (!carousel) {
            const error = new Error('Carousel não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if (carousel.imagem) {
            carousel.imagem = await (0, aws_1.getURL)(carousel.imagem);
        }
        if (carousel.imagemSmall) {
            carousel.imagemSmall = await (0, aws_1.getURL)(carousel.imagemSmall);
        }
        res.status(200).json({
            msg: 'Sucesso',
            carousel,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getCarousel = getCarousel;
// Controller para editar carousel
const editCarousel = async (req, res, next) => {
    try {
        let { carouselId, titulo, descricao, 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) },
        });
        where: {
            id: Number(userId);
        }
    }
    finally { }
    ;
    if (!admin) {
        const error = new Error('Admin não encontrado!');
        error.statusCode = 422;
        throw error;
    }
    const carousel = await prisma_1.prisma.carousel.findUnique({
        where: { id: Number(carouselId) },
    });
    if (!carousel) {
        const error = new Error('Carousel não encontrada!');
        error.statusCode = 422;
        throw error;
    }
    if (Boolean(titulo)) {
        carousel.titulo = titulo;
    }
    if (Boolean(descricao)) {
        carousel.descricao = descricao;
    }
    if (Boolean(status)) {
        carousel.status = status;
        carousel.dataDespacho = new Date();
    }
    const updatedCarousel = await prisma_1.prisma.carousel.update({
        where: { id: Number(carouselId) },
        data: {
            titulo: titulo !== null && titulo !== void 0 ? titulo : carousel.titulo,
            descricao: descricao !== null && descricao !== void 0 ? descricao : carousel.descricao,
            status: status !== null && status !== void 0 ? status : carousel.status,
            dataDespacho: status ? new Date() : carousel.dataDespacho,
        },
    });
    // HistoricoActividade
    await (0, main_1.createHistoricoActividade)(`Editou carousel`, 'Carousel', updatedCarousel.id, admin);
    res.status(201).json({ msg: 'Sucesso', carousel: updatedCarousel });
    res.status(201).json({ msg: 'Sucesso', carousel });
};
exports.editCarousel = editCarousel;
try { }
catch (err) {
    next(err);
}
;
const changeImage = async (req, res, next) => {
    try {
        const { carouselId, 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) },
            });
            const admin = await User.findByPk(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 carousel = await prisma_1.prisma.carousel.findUnique({
                where: { id: Number(carouselId) },
            });
            if (!carousel) {
                const error = new Error('Carousel não encontrada!');
                error.statusCode = 422;
                throw error;
            }
            // Primeiro deleta o arquivo
            await (0, aws_1.deleteFile)(carousel.imagem);
            // Depois renomeia e faz o upload
            imagem.filename = (0, upload_1.generateFileName)(imagem);
            await (0, aws_1.uploadFile)(imagem);
            carousel.imagem = imagem.filename;
            const updatedCarousel = await prisma_1.prisma.carousel.update({
                where: { id: Number(carouselId) },
                data: { imagem: imagem.filename },
            });
            // HistoricoActividade
            await (0, main_1.createHistoricoActividade)(`Alterou imagem do carousel`, 'Carousel', updatedCarousel.id, admin);
            updatedCarousel.imagem = await (0, aws_1.getURL)(updatedCarousel.imagem);
            res.status(201).json({
                msg: 'Sucesso!',
                carousel,
            });
        }
        try { }
        catch (error) {
            next(error);
        }
    }
    finally { }
    ;
    export const changeImageSmall = async (req, res, next) => {
        try {
            const { carouselId, userId } = req.body;
            const imagemSmall = 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) },
                });
                const admin = await User.findByPk(userId);
                if (!admin) {
                    const error = new Error('Admin não encontrado!');
                    error.statusCode = 422;
                    throw error;
                }
                if (!imagemSmall) {
                    const error = new Error('Por favor fornceça uma imagem');
                    error.statusCode = 422;
                    throw error;
                }
                const carousel = await prisma_1.prisma.carousel.findUnique({
                    where: { id: Number(carouselId) },
                });
                if (!carousel) {
                    const error = new Error('Carousel não encontrada!');
                    error.statusCode = 422;
                    throw error;
                }
                // Depois renomeia e faz o upload
                imagemSmall.filename = (0, upload_1.generateFileName)(imagemSmall);
                const updatedCarousel = await prisma_1.prisma.carousel.update({
                    where: { id: Number(carouselId) },
                    data: { imagemSmall: imagemSmall.filename },
                });
                await (0, aws_1.uploadFile)(imagemSmall);
                // HistoricoActividade
                await (0, main_1.createHistoricoActividade)(`Alterou imagem do carousel`, 'Carousel', updatedCarousel.id, admin);
                updatedCarousel.imagem = await (0, aws_1.getURL)(updatedCarousel.imagem);
                res.status(201).json({
                    msg: 'Sucesso!',
                    carousel,
                });
            }
            try { }
            catch (error) {
                next(error);
            }
        }
        finally { }
        ;
        export const deleteCarousel = async (req, res, next) => {
            try {
                const { carouselId, 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 carousel = await prisma_1.prisma.carousel.findUnique({
                    where: { id: Number(carouselId) },
                });
                if (!carousel) {
                    const error = new Error('Carousel não encontrado!');
                    error.statusCode = 422;
                    throw error;
                }
                await prisma_1.prisma.carousel.delete({ where: { id: Number(carouselId) } });
                await (0, main_1.createHistoricoActividade)(`Deletou carousel: ${carousel.titulo}`, 'Carousel', carousel.id, user);
                res.status(204).json({ msg: 'Sucesso!' });
            }
            catch (err) {
                next(err);
            }
        };
    };
};
exports.changeImage = changeImage;
