"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteCarousel = exports.changeImageSmall = 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");
const createCarousel = async (req, res, next) => {
    try {
        const { titulo, descricao, userId } = req.body;
        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 || !imagem.length) {
            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;
        }
        imagem[0].filename = (0, upload_1.generateFileName)(imagem[0]);
        const carouselData = {
            titulo,
            descricao,
            imagem: imagem[0].filename,
            adminId: Number(userId),
        };
        if (imagemSmall && imagemSmall.length) {
            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 (0, aws_1.uploadFile)(imagem[0]);
        if (carousel.imagemSmall && imagemSmall && imagemSmall.length) {
            await (0, aws_1.uploadFile)(imagemSmall[0]);
        }
        await (0, main_1.createHistoricoActividade)(`Criou carousel`, 'Carousel', carousel.id, admin);
        const responseCarousel = {
            ...carousel,
            imagem: await (0, aws_1.getURL)(carousel.imagem),
            imagemSmall: carousel.imagemSmall ? await (0, aws_1.getURL)(carousel.imagemSmall) : null,
        };
        res.status(201).json({ msg: 'Sucesso', carousel: responseCarousel });
    }
    catch (err) {
        next(err);
    }
};
exports.createCarousel = createCarousel;
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 = Number(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' },
        });
        const responseCarousels = await Promise.all(carousels.map(async (carousel) => ({
            ...carousel,
            imagem: await (0, aws_1.getURL)(carousel.imagem),
            imagemSmall: carousel.imagemSmall ? await (0, aws_1.getURL)(carousel.imagemSmall) : null,
        })));
        res.status(200).json({
            msg: 'Sucesso',
            carousels: responseCarousels,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getCarousels = getCarousels;
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;
        }
        const responseCarousel = {
            ...carousel,
            imagem: await (0, aws_1.getURL)(carousel.imagem),
            imagemSmall: carousel.imagemSmall ? await (0, aws_1.getURL)(carousel.imagemSmall) : null,
        };
        res.status(200).json({ msg: 'Sucesso', carousel: responseCarousel });
    }
    catch (err) {
        next(err);
    }
};
exports.getCarousel = getCarousel;
const editCarousel = async (req, res, next) => {
    try {
        const { 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) },
        });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const existingCarousel = await prisma_1.prisma.carousel.findUnique({
            where: { id: Number(carouselId) },
        });
        if (!existingCarousel) {
            const error = new Error('Carousel não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        const updatedCarousel = await prisma_1.prisma.carousel.update({
            where: { id: Number(carouselId) },
            data: {
                titulo: titulo !== null && titulo !== void 0 ? titulo : existingCarousel.titulo,
                descricao: descricao !== null && descricao !== void 0 ? descricao : existingCarousel.descricao,
                status: status !== null && status !== void 0 ? status : existingCarousel.status,
                dataDespacho: status ? new Date() : existingCarousel.dataDespacho,
            },
        });
        await (0, main_1.createHistoricoActividade)(`Editou carousel`, 'Carousel', updatedCarousel.id, admin);
        const responseCarousel = {
            ...updatedCarousel,
            imagem: await (0, aws_1.getURL)(updatedCarousel.imagem),
            imagemSmall: updatedCarousel.imagemSmall ? await (0, aws_1.getURL)(updatedCarousel.imagemSmall) : null,
        };
        res.status(201).json({ msg: 'Sucesso', carousel: responseCarousel });
    }
    catch (err) {
        next(err);
    }
};
exports.editCarousel = editCarousel;
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) },
        });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (!imagem) {
            const error = new Error('Por favor, forneç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;
        }
        await (0, aws_1.deleteFile)(carousel.imagem);
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        await (0, aws_1.uploadFile)(imagem);
        const updatedCarousel = await prisma_1.prisma.carousel.update({
            where: { id: Number(carouselId) },
            data: { imagem: imagem.filename },
        });
        await (0, main_1.createHistoricoActividade)(`Alterou imagem do carousel`, 'Carousel', updatedCarousel.id, admin);
        const responseCarousel = {
            ...updatedCarousel,
            imagem: await (0, aws_1.getURL)(updatedCarousel.imagem),
            imagemSmall: updatedCarousel.imagemSmall ? await (0, aws_1.getURL)(updatedCarousel.imagemSmall) : null,
        };
        res.status(201).json({ msg: 'Sucesso!', carousel: responseCarousel });
    }
    catch (error) {
        next(error);
    }
};
exports.changeImage = changeImage;
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) },
        });
        if (!admin) {
            const error = new Error('Admin não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (!imagemSmall) {
            const error = new Error('Por favor, forneç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;
        }
        imagemSmall.filename = (0, upload_1.generateFileName)(imagemSmall);
        await (0, aws_1.uploadFile)(imagemSmall);
        const updatedCarousel = await prisma_1.prisma.carousel.update({
            where: { id: Number(carouselId) },
            data: { imagemSmall: imagemSmall.filename },
        });
        await (0, main_1.createHistoricoActividade)(`Alterou imagem do carousel`, 'Carousel', updatedCarousel.id, admin);
        const responseCarousel = {
            ...updatedCarousel,
            imagem: await (0, aws_1.getURL)(updatedCarousel.imagem),
            imagemSmall: updatedCarousel.imagemSmall ? await (0, aws_1.getURL)(updatedCarousel.imagemSmall) : null,
        };
        res.status(201).json({ msg: 'Sucesso!', carousel: responseCarousel });
    }
    catch (error) {
        next(error);
    }
};
exports.changeImageSmall = changeImageSmall;
const deleteCarousel = 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 carousel = await prisma_1.prisma.carousel.findUnique({
            where: { id: Number(id) },
        });
        if (!carousel) {
            const error = new Error('Carousel não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (carousel.imagem)
            await (0, aws_1.deleteFile)(carousel.imagem);
        await prisma_1.prisma.carousel.delete({ where: { id: Number(id) } });
        await (0, main_1.createHistoricoActividade)(`Deletou carousel: ${carousel.titulo}`, 'Carousel', carousel.id, user);
        res.status(204).json({ msg: 'Sucesso!' });
    }
    catch (err) {
        next(err);
    }
};
exports.deleteCarousel = deleteCarousel;
