"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeStatus = exports.getSimulacao = exports.getSimulacaos = exports.registerSimulacao = void 0;
const postmark_1 = __importDefault(require("../../services/postmark"));
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 simulation_util_1 = require("./simulation.util");
// Metodo para registar Simulacao
const registerSimulacao = async (req, res, next) => {
    try {
        let { nomeSolicitante, nomeEmpresa, email, tel, nif, provincia, perfil, descricao, emolumentoId, montante, meses, 
        // Dados do secretario
        userId, } = req.body;
        const emolumento = await prisma_1.prisma.emolumento.findUnique({
            where: { id: Number(emolumentoId) },
        });
        if (!emolumento) {
            const error = new Error('Emolumento não encontrado!');
            error.statusCode = 422;
            throw error;
        }
        let cliente;
        const foundEmail = await prisma_1.prisma.cliente.findFirst({ where: { email } });
        if (foundEmail) {
            cliente = foundEmail;
        }
        const foundNif = await prisma_1.prisma.cliente.findFirst({ where: { nif } });
        if (foundNif) {
            cliente = foundNif;
        }
        if (!cliente) {
            cliente = await prisma_1.prisma.cliente.create({
                data: { nome: nomeEmpresa, provincia, perfil, tel, email, nif },
            });
        }
        const { prestacaoMensalEstimada, juroMensalEstimado } = (0, simulation_util_1.calculateSimulacao)(montante, emolumento, meses);
        let simulacao = await prisma_1.prisma.simulacao.create({
            data: {
                provincia,
                nomeSolicitante,
                nomeEmpresa,
                nif,
                descricao,
                clienteId: cliente.id,
                emolumentoId: emolumento.id,
                montante,
                prestacaoMensalEstimada,
                juroMensalEstimado,
                taxaMensal: emolumento.taxaJuro,
            },
        });
        await postmark_1.default.sendEmail({
            To: cliente.email,
            From: process.env.SENDER_EMAIL,
            Subject: `Sua simulação de compra foi recebida com sucesso`,
            HtmlBody: `
      <h2>Bem-vindo a Novocredito</h2>

        <p>
          Saudações ${cliente.nome},
        </p>

        <p>
          Recebemos a sua simulação com sucesso. Obrigado pelo seu interesse nos nossos serviços.
        </p>

        <p>Abaixo está o resumo da sua simulação:</p>

        <p><b>Producto:</b> ${emolumento.designacao}</p>

        <p><b>Montante Solicitado:</b> ${(0, main_1.formatMoeda)(montante)}</p>

        <p><b>Prestação Mensal Estimada:</b> ${(0, main_1.formatMoeda)(prestacaoMensalEstimada)}</p>

        <p><b>Taxa Mensal:</b> ${emolumento.taxaJuro}%</p>

        <p>
          Esta simulação ainda não representa um crédito final. Em breve, a nossa equipa comercial irá 
          entrar em contacto consigo para confirmar os detalhes, esclarecer dúvidas e ajudar a avançar 
          para a contratação do serviço.
        </p>
        
        <br/>
        <p>
          Com os melhores cumprimentos,<br/>
          <b>Equipa Novocredito</b> <br />
        </p>
        `,
            MessageStream: 'outbound',
        });
        res.status(201).json({
            msg: 'Sucesso',
            simulacao,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.registerSimulacao = registerSimulacao;
const getSimulacaos = async (req, res, next) => {
    try {
        const { status, emolumentoId, planoId, clienteId } = 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;
        }
        if (Boolean(emolumentoId)) {
            filterObject.emolumentoId = emolumentoId;
        }
        if (Boolean(planoId)) {
            filterObject.planoId = planoId;
        }
        if (Boolean(clienteId)) {
            filterObject.clienteId = clienteId;
        }
        const total = await prisma_1.prisma.simulacao.count({ where: filterObject });
        const simulacaos = await prisma_1.prisma.simulacao.findMany({
            where: filterObject,
            take: perPage,
            skip: (0, pagination_1.skip)(page, perPage),
            orderBy: { createdAt: 'desc' },
            include: { cliente: true, emolumento: true, },
        });
        res.status(200).json({
            msg: 'Sucesso',
            simulacaos,
            ...(0, pagination_1.paginationResult)(total, page, perPage),
        });
    }
    catch (err) {
        next(err);
    }
};
exports.getSimulacaos = getSimulacaos;
// Funcao que busca um Simulacao pelo Id
const getSimulacao = async (req, res, next) => {
    var _a;
    try {
        const { id } = req.params;
        const simulacao = await prisma_1.prisma.simulacao.findUnique({
            where: { id: Number(id) },
            include: { cliente: true, emolumento: true, },
        });
        if (!simulacao) {
            const error = new Error('Simulacao não encontrada!');
            error.statusCode = 422;
            throw error;
        }
        if ((_a = simulacao === null || simulacao === void 0 ? void 0 : simulacao.emolumento) === null || _a === void 0 ? void 0 : _a.imagem) {
            simulacao.emolumento.imagem = await (0, aws_1.getURL)(simulacao.emolumento.imagem);
        }
        res.status(200).json({ msg: 'Sucesso', simulacao });
    }
    catch (err) {
        next(err);
    }
};
exports.getSimulacao = getSimulacao;
const changeStatus = async (req, res, next) => {
    try {
        const { status, userId, simulacaoId } = req.body;
        let admin;
        if (Boolean(userId)) {
            // Simulacao a realizar a operacao
            admin = await prisma_1.prisma.user.findUnique({
                where: { id: Number(userId), isAdmin: true },
                include: { dadosPessoais: true },
            });
            if (!admin) {
                const error = new Error(`admin não encontrado!`);
                error.statusCode = 422;
                throw error;
            }
        }
        const simulacao = await prisma_1.prisma.simulacao.findUnique({
            where: { id: Number(simulacaoId) },
        });
        if (!simulacao) {
            const error = new Error(`Simulacao não encontrada!`);
            error.statusCode = 422;
            throw error;
        }
        const updatedSimulacao = await prisma_1.prisma.simulacao.update({
            where: { id: simulacao.id },
            data: { status },
        });
        // Se a venda for concretizada altera o estatus o cliente para convertido
        if (simulacao.status === 'Convertido') {
            await prisma_1.prisma.cliente.update({
                where: { id: simulacao.clienteId, status: { not: 'Convertido' } },
                data: { status: simulacao.status },
            });
        }
        await (0, main_1.createHistoricoActividade)(`Alterou o estado da simulacao ${status}`, 'Simulacao', updatedSimulacao.id, admin);
        res.status(201).json({
            msg: 'Sucesso',
            simulacao: updatedSimulacao,
        });
    }
    catch (err) {
        next(err);
    }
};
exports.changeStatus = changeStatus;
