"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeIdentificacao = exports.changeFoto = exports.editDadosPessoais = void 0;
const express_validator_1 = require("express-validator");
const prisma_1 = require("../../database/prisma");
const aws_1 = require("../../services/aws");
const upload_1 = require("../../middleware/upload");
const main_1 = require("../../util/main");
const editDadosPessoais = async (req, res, next) => {
    try {
        let { nome, genero, dataNascimento, estadoCivil, provincia, municipio, bairro, rua, nacionalidade, tel1, tel2, email, nif, tipoIdentificacao, numeroBI, dadosPessoaisId, userId, } = req.body;
        if (numeroBI)
            numeroBI = numeroBI.toUpperCase();
        const errors = (0, express_validator_1.validationResult)(req);
        if (!errors.isEmpty()) {
            const error = new Error(errors.array()[0].msg);
            error.statusCode = 422;
            throw error;
        }
        let admin;
        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 dadosPessoais = await prisma_1.prisma.dadosPessoais.findUnique({
            where: { id: Number(dadosPessoaisId) },
        });
        if (!dadosPessoais) {
            const error = new Error('Dados pessoais não encontrados!');
            error.statusCode = 422;
            throw error;
        }
        if (Boolean(email)) {
            const foundEmail = await prisma_1.prisma.dadosPessoais.findFirst({
                where: { email, id: { not: Number(dadosPessoaisId) } },
            });
            if (foundEmail) {
                const error = new Error(`O email ${email} já está sendo usado!`);
                error.statusCode = 422;
                throw error;
            }
        }
        if (Boolean(tel1)) {
            const foundTel1 = await prisma_1.prisma.dadosPessoais.findFirst({
                where: { tel1, id: { not: Number(dadosPessoaisId) } },
            });
            if (foundTel1) {
                const error = new Error(`O tel1 ${tel1} já está sendo usado!`);
                error.statusCode = 422;
                throw error;
            }
        }
        if (Boolean(tipoIdentificacao) && !numeroBI) {
            dadosPessoais.tipoIdentificacao = tipoIdentificacao;
        }
        if (Boolean(numeroBI)) {
            const filtro = {
                numeroBI: numeroBI,
                tipoIdentificacao: tipoIdentificacao || dadosPessoais.tipoIdentificacao,
                id: { not: Number(dadosPessoaisId) },
            };
            const foundBI = await prisma_1.prisma.dadosPessoais.findFirst({ where: filtro });
            if (foundBI) {
                const error = new Error(`O BI ${numeroBI} já está sendo usado!`);
                error.statusCode = 422;
                throw error;
            }
            numeroBI = numeroBI.toUpperCase();
        }
        const updateData = {};
        if (nome)
            updateData.nome = nome;
        if (genero)
            updateData.genero = genero;
        if (dataNascimento)
            updateData.dataNascimento = dataNascimento;
        if (estadoCivil)
            updateData.estadoCivil = estadoCivil;
        if (provincia)
            updateData.provincia = provincia;
        if (municipio)
            updateData.municipio = municipio;
        if (bairro)
            updateData.bairro = bairro;
        if (rua)
            updateData.rua = rua;
        if (nacionalidade)
            updateData.nacionalidade = nacionalidade;
        if (tel1)
            updateData.tel1 = tel1;
        if (tel2)
            updateData.tel2 = tel2;
        if (nif)
            updateData.nif = nif;
        if (email)
            updateData.email = email;
        if (tipoIdentificacao)
            updateData.tipoIdentificacao = tipoIdentificacao;
        if (numeroBI)
            updateData.numeroBI = numeroBI;
        let updatedDados = await prisma_1.prisma.dadosPessoais.update({
            where: { id: Number(dadosPessoaisId) },
            data: updateData,
        });
        if (email) {
            const user = await prisma_1.prisma.user.findFirst({
                where: { dadosPessoaisId: Number(dadosPessoaisId) },
            });
            if (user) {
                await prisma_1.prisma.user.update({
                    where: { id: user.id },
                    data: { email },
                });
            }
        }
        if (updatedDados.fotoURL) {
            updatedDados.fotoURL = await (0, aws_1.getURL)(updatedDados.fotoURL);
        }
        if (admin) {
            await (0, main_1.createHistoricoActividade)(`Editou dados pessoais`, 'DadosPessoais', Number(dadosPessoaisId), admin);
        }
        res.status(201).json({
            msg: 'Editado com sucesso!',
            dadosPessoais: updatedDados,
        });
    }
    catch (error) {
        next(error);
    }
};
exports.editDadosPessoais = editDadosPessoais;
const changeFoto = async (req, res, next) => {
    try {
        const { dadosPessoaisId, userId } = req.body;
        const foto = 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 (!foto) {
            const error = new Error('Por favor fornceça uma foto');
            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 dadosPessoais = await prisma_1.prisma.dadosPessoais.findUnique({
            where: { id: Number(dadosPessoaisId) },
        });
        if (!dadosPessoais) {
            const error = new Error('Dados pessoais não encontrados!');
            error.statusCode = 422;
            throw error;
        }
        foto.filename = (0, upload_1.generateFileName)(foto);
        await (0, aws_1.uploadFile)(foto);
        const updatedDados = await prisma_1.prisma.dadosPessoais.update({
            where: { id: Number(dadosPessoaisId) },
            data: { fotoURL: foto.filename },
        });
        if (updatedDados.fotoURL) {
            updatedDados.fotoURL = await (0, aws_1.getURL)(updatedDados.fotoURL);
        }
        if (admin) {
            await (0, main_1.createHistoricoActividade)('Editou Foto', 'DadosPessoais', Number(dadosPessoaisId), admin);
        }
        res.status(201).json({
            msg: 'Editado com sucesso!',
            dadosPessoais: updatedDados,
        });
    }
    catch (error) {
        next(error);
    }
};
exports.changeFoto = changeFoto;
const changeIdentificacao = async (req, res, next) => {
    try {
        const { dadosPessoaisId, userId } = req.body;
        const identificacao = 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 (!identificacao) {
            const error = new Error('Por favor forneça o documento de identificação');
            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 dadosPessoais = await prisma_1.prisma.dadosPessoais.findUnique({
            where: { id: Number(dadosPessoaisId) },
        });
        if (!dadosPessoais) {
            const error = new Error('Dados pessoais não encontrados!');
            error.statusCode = 422;
            throw error;
        }
        identificacao.filename = (0, upload_1.generateFileName)(identificacao);
        await (0, aws_1.uploadFile)(identificacao);
        const currentDocs = typeof dadosPessoais.docs === 'object' && dadosPessoais.docs !== null
            ? dadosPessoais.docs
            : {};
        const updatedDados = await prisma_1.prisma.dadosPessoais.update({
            where: { id: Number(dadosPessoaisId) },
            data: {
                docs: {
                    ...currentDocs,
                    identificacao: identificacao.filename,
                },
            },
        });
        if (updatedDados.fotoURL) {
            updatedDados.fotoURL = await (0, aws_1.getURL)(updatedDados.fotoURL);
        }
        if (admin) {
            await (0, main_1.createHistoricoActividade)('Editou Foto', 'DadosPessoais', Number(dadosPessoaisId), admin);
        }
        res.status(201).json({
            msg: 'Editado com sucesso!',
            dadosPessoais: updatedDados,
        });
    }
    catch (error) {
        next(error);
    }
};
exports.changeIdentificacao = changeIdentificacao;
