const bodyParser = require("body-parser");
const express = require("express");
const { getErrorMessage } = require("../constants/api_constans.js");

const success = (data, msg, param = null) => {
    var dataJson = data;
    var data = {};
    if (param != null) data[param] = dataJson;
    else data = dataJson;

    return {
        success: true,
        message: msg,
        data,
    };
};

const succes = (res, data, msg, param) => {
    var dataJson = data;
    var data = {};
    if (param != null) data[param] = dataJson;
    else data = dataJson;

    return res.status(200).json({
        success: true,
        message: msg,
        data,
    });
};

const error = (res, errorCode, code, message = null) => {
    var errorMessage = getErrorMessage(errorCode);

    return res.status(code).json({
        success: false,
        message: message ?? errorMessage,
        error_code: errorCode,
        data: null,
    });
};

const failed = (errorCode, message = null) => {
    var errorMessage = getErrorMessage(errorCode);

    return {
        success: false,
        message: message ?? errorMessage,
        error_code: errorCode,
        data: null,
    };
};

const pagination = (page, size) => {
    let limit = null;
    let offset = null;
    if (page != null) {
        limit = size ? +size : 5;
        offset = limit ? 0 + (page - 1) * limit : null;
    }

    return {
        limit,
        offset,
    };
};

const pagingData = (data) => {
    const { count: totalItems, rows: items } = data;
    return items;
};

const pagingInfo = (data, page, limit) => {
    const { count: totalItems, rows: items } = data;
    const currentPage = page ? +page : 0;
    const totalPages = Math.ceil(totalItems / limit);
    const pageSize = +limit;

    return {
        page: currentPage,
        per_page: pageSize,
        total: totalItems,
        total_pages: totalPages,
    };
};

const paginationResponse = (data, page, limit = 5, key) => {
    const response = {};

    if (page != null) {
        const items = pagingData(data);
        const paginate = pagingInfo(data, page, limit);

        response[key] = items;
        if (paginate != null) response["pagination"] = paginate;
    } else {
        const items = pagingData(data);
        response[key] = items;
    }

    return response;
};

const json = (res, data) => {
    var statusCode = data.success == true ? 200 : 500;
    return res.status(statusCode).json(data);
};

module.exports = {
    success,
    succes,
    error,
    pagination,
    pagingData,
    pagingInfo,
    paginationResponse,
    failed,
    json,
};
