import { Request, Response } from "express";
import TemplateUsageService from "../../../service/configuration/templateUsageService";
import TemplateUsageFactory from "../../../factory/admin/configuration/templateUsage";
import { UpdateTemplateUsageCommand } from "../../../command/configuration/templateUsage/templateUsageCommand";
import TemplateUsageCommandHandler from "../../../command/configuration/templateUsage/templateUsageCommandHandler";
import PermissionHelper from "../../../helpers/permissionHelper";
import ForbiddenRequestException from "../../../exceptions/forbiddenRequestException";
import { PermissionModule } from "../../../type/permissionTypes";
import { PdfExport } from "../../../helpers/pdfExport";
import { DemoDataHelper } from "../../../helpers/demoDataHelper";

/**
 * @description get all templateUsages
 * @param req {Request} Express req object
 * @param res {Response} Express res object
 * @returns {Promise<*>}
 */
export async function getAllTemplateUsages(req: Request, res: Response): Promise<any> {
  let templateUsages = await TemplateUsageService.getAll();

  if (!req.isOwner) {
    templateUsages = templateUsages.filter((tu) => {
      return (
        PermissionHelper.can(req.permissions, "update", "settings", tu.scope.split(".")[0] as PermissionModule) ||
        PermissionHelper.can(req.permissions, "update", "club", tu.scope.split(".")[0] as PermissionModule)
      );
    });
  }

  res.json(TemplateUsageFactory.mapToBase(templateUsages));
}

/**
 * @description print demo of templateUsage
 * @param req {Request} Express req object
 * @param res {Response} Express res object
 * @returns {Promise<*>}
 */
export async function printTemplateUsageDemo(req: Request, res: Response): Promise<any> {
  const scope = req.params.scope as PermissionModule;

  let demoData = DemoDataHelper.getData(scope);
  let pdf = await PdfExport.renderFile({
    template: scope,
    saveToDisk: false,
    data: demoData,
  });

  let pdfbuffer = Buffer.from(pdf);

  res.setHeader("Content-Type", "application/pdf");
  res.setHeader("Content-Length", pdfbuffer.byteLength);
  res.setHeader("Content-Disposition", "inline; filename=preview.pdf");

  res.send(pdfbuffer);
}

/**
 * @description update templateUsage
 * @param req {Request} Express req object
 * @param res {Response} Express res object
 * @returns {Promise<*>}
 */
export async function updateTemplateUsage(req: Request, res: Response): Promise<any> {
  const scope = req.params.scope;
  let allowedSettings = PermissionHelper.can(
    req.permissions,
    "update",
    "settings",
    req.params.scope as PermissionModule
  );
  let allowedClub = PermissionHelper.can(req.permissions, "update", "club", req.params.scope as PermissionModule);

  if (!(req.isOwner || allowedSettings || allowedClub)) {
    throw new ForbiddenRequestException(`missing permission for editing scope ${req.params.scope}`);
  }

  const headerId = req.body.headerId ?? null;
  const bodyId = req.body.bodyId ?? null;
  const footerId = req.body.footerId ?? null;
  const headerHeight = req.body.headerHeight ?? null;
  const footerHeight = req.body.footerHeight ?? null;

  let updateTemplateUsage: UpdateTemplateUsageCommand = {
    scope: scope,
    headerId: headerId,
    bodyId: bodyId,
    footerId: footerId,
    headerHeight: headerHeight,
    footerHeight: footerHeight,
  };
  await TemplateUsageCommandHandler.update(updateTemplateUsage);

  res.sendStatus(204);
}