"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteGaleria = exports.changeImage = exports.editGaleria = exports.changeStatus = exports.getGaleria = exports.getGalerias = exports.galeriaCreate = 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");
const prisma_2 = require("../../generated/prisma");
const galeriaCreate = async (req, res, next) => {
    try {
        const { title, subtitle, descricao, userId } = req.body;
        const imagem = req.file;
        if (!imagem) {
            const error = new Error(`Carregue por favor uma imagem!`);
            error.statusCode = 422;
            throw error;
        }
        const user = await prisma_1.prisma.user.findUnique({ where: { id: Number(userId) } });
        if (!user) {
            const error = new Error(`Utilizador não encontrado!`);
            error.statusCode = 422;
            throw error;
        }
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        const galeria = await prisma_1.prisma.galeria.create({
            data: {
                title,
                subtitle,
                descricao,
                imagem: imagem.filename,
                adminId: Number(userId),
            },
        });
        await (0, aws_1.uploadFile)(imagem);
        res.status(201).json({
            msg: 'Sucesso',
            galeria,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.galeriaCreate = galeriaCreate;
const getGalerias = async (req, res, next) => {
    try {
        let { status } = req.query;
        const page = (0, pagination_1.getPage)(req.query.page);
        let paramPerPage = req.query.perPage;
        let perPage = 50;
        if (paramPerPage) {
            perPage = +paramPerPage;
        }
        const filterObject = {};
        if (Boolean(status))
            filterObject.status = status;
        const total = await prisma_1.prisma.galeria.count({ where: filterObject });
        const galerias = await prisma_1.prisma.galeria.findMany({
            where: filterObject,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
        });
        for (const galeria of galerias) {
            if (galeria.imagem)
                galeria.imagem = await (0, aws_1.getURL)(galeria.imagem);
        }
        res.status(200).json({
            msg: 'Sucesso',
            galerias,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getGalerias = getGalerias;
const getGaleria = async (req, res, next) => {
    try {
        const { id } = req.params;
        const galeria = await prisma_1.prisma.galeria.findUnique({ where: { id: Number(id) } });
        if (!galeria) {
            const error = new Error('Galeria não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        if (galeria.imagem)
            galeria.imagem = await (0, aws_1.getURL)(galeria.imagem);
        res.status(200).json({ msg: 'Sucesso', galeria });
    }
    catch (err) {
        next(err);
    }
};
exports.getGaleria = getGaleria;
const changeStatus = async (req, res, next) => {
    try {
        const { galeriaId, 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;
        }
        if (!Object.values(prisma_2.Status).includes(status)) {
            const error = new Error(`Status inválido: ${status}`);
            error.statusCode = 422;
            throw error;
        }
        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 galeria = await prisma_1.prisma.galeria.update({
            where: { id: Number(galeriaId) },
            data: { status, dataDespacho: new Date() },
        });
        await (0, main_1.createHistoricoActividade)(`Mudou o status do para '${status}'`, 'Galeria', galeria.id, user);
        res.status(201).json({ msg: 'Sucesso', galeria });
    }
    catch (error) {
        next(error);
    }
};
exports.changeStatus = changeStatus;
const editGaleria = async (req, res, next) => {
    try {
        const { galeriaId, title, subtitle, descricao, 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.findUnique({ where: { id: Number(userId) } });
        if (!user) {
            const error = new Error('Utilizador não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        const updateData = { dataDespacho: new Date() };
        if (title)
            updateData.title = title;
        if (subtitle)
            updateData.subtitle = subtitle;
        if (descricao)
            updateData.descricao = descricao;
        const galeria = await prisma_1.prisma.galeria.update({
            where: { id: Number(galeriaId) },
            data: updateData,
        });
        await (0, main_1.createHistoricoActividade)(`Editou o galeria`, 'Galeria', galeria.id, user);
        res.status(201).json({ msg: 'Sucesso', galeria });
    }
    catch (error) {
        next(error);
    }
};
exports.editGaleria = editGaleria;
const changeImage = async (req, res, next) => {
    try {
        const { galeriaId, userId } = req.body;
        const imagem = req.file;
        const errors = (0, express_validator_1.validationResult)(req);
        let admin;
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        if (!imagem) {
            const error = new Error('Por favor fornceça uma imagem');
            error.statusCode = 422;
            throw error;
        }
        if (Boolean(userId)) {
            admin = await prisma_1.prisma.user.findUnique({ where: { id: Number(userId) } });
            if (!admin) {
                const error = new Error('User não encontrados!');
                error.statusCode = 422;
                throw error;
            }
        }
        const galeria = await prisma_1.prisma.galeria.findUnique({ where: { id: Number(galeriaId) } });
        if (!galeria) {
            const error = new Error('Galeria não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        imagem.filename = (0, upload_1.generateFileName)(imagem);
        await (0, aws_1.uploadFile)(imagem);
        const updatedGaleria = await prisma_1.prisma.galeria.update({
            where: { id: Number(galeriaId) },
            data: { imagem: imagem.filename },
        });
        if (updatedGaleria.imagem) {
            updatedGaleria.imagem = await (0, aws_1.getURL)(updatedGaleria.imagem);
        }
        if (admin) {
            await (0, main_1.createHistoricoActividade)('Alterou imagem do Galeria', 'Galeria', updatedGaleria.id, admin);
        }
        res.status(201).json({ msg: 'Editado com sucesso!', galeria: updatedGaleria });
    }
    catch (error) {
        next(error);
    }
};
exports.changeImage = changeImage;
const deleteGaleria = async (req, res, next) => {
    try {
        const { id, userId, observacao } = 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.findUnique({ where: { id: Number(userId) } });
        if (!user) {
            const error = new Error(`User não encontrado!`);
            error.statusCode = 422;
            throw error;
        }
        await prisma_1.prisma.galeria.delete({ where: { id: Number(id) } });
        await (0, main_1.createHistoricoActividade)(`Deletou o galeria.`, 'Galeria', Number(id), user, observacao);
        res.status(204).json({ msg: 'Deletado com sucesso' });
    }
    catch (error) {
        next(error);
    }
};
exports.deleteGaleria = deleteGaleria;
