import { createCanvas, loadImage, registerFont, CanvasRenderingContext2D } from "canvas";
import fs from "fs";
import path from "path";
import CONSTANTS from "../config/constants";
import occupancyDB from "../models/occupancy.model";
import fsPromises from "fs/promises";
import log from "../config/log";

export const generateAadhaarCardFront = async (
  tenantId: number,
  templatePath: string,
  name: string,
  dob: string,
  gender: string,
  aadhaarNumber: string,
  photoLink: string,
  clientId: number,
) => {
  const U = "createAadhaar";
  const F = "generateAadhaarCardFront";
  try {
    const template = await loadImage(templatePath);
    const canvas = createCanvas(template.width, template.height);
    const ctx = canvas.getContext("2d");

    ctx.drawImage(template, 0, 0, template.width, template.height);

    const photo = await loadImage(`data:image/jpeg;base64,${photoLink}`);
    const photoX = 50;
    const photoY = 130;
    const photoWidth = 120;
    const photoHeight = 150;
    ctx.drawImage(photo, photoX, photoY, photoWidth, photoHeight);

    ctx.font = "25px Arial";
    ctx.fillStyle = "black";

    ctx.fillText(`${name}`, 200, 150);
    ctx.fillText(`DOB: ${dob}`, 200, 190);
    ctx.fillText(`${gender}`, 200, 230);

    ctx.font = "bold 25px Arial";
    ctx.fillText(`${aadhaarNumber}`, 250, 380);
    
    const buffer = canvas.toBuffer("image/png");

    // const occupancy = await occupancyDB.getByTenantId({
    //   tenantId,
    // });
    const occupancy = await occupancyDB.getByTenantIdAndClientId({
      tenantId,
      clientId
    });

    const folderName = `tenant_${occupancy.tenantId}`;
    const folderPath = `uploads/documents/client_${occupancy.clientId}/prop_${occupancy.propId}/room_${occupancy.roomId}_bed_${occupancy.bedId}/${folderName}`;
    const urlBase = folderPath.replace(
      "uploads/",
      `${process.env.UPLOAD_PATH}/`
    );

    if (!fs.existsSync(folderPath)) {
      await fsPromises.mkdir(folderPath, { recursive: true });
    }

    const fileName = `Aadhaar.png`;
    fs.writeFileSync(`${folderPath}/${fileName}`, buffer as Uint8Array);
    const url = `${urlBase}/${fileName}`;

    log.info(`[${U}], [${F}], Client Id [${occupancy.clientId}], Tenant Id [${tenantId}], URL [${url}], Aadhaar Card Generated Successfully`)

    return {
      imageUrl: url,
      isSuccess: true,
    };
  } catch (error: any) {
    log.info(`[${U}], [${F}], Error [${JSON.stringify(error)}]`);
    return {
      msg: CONSTANTS.MSG.ERROR_MESSAGE,
      isSuccess: false,
    };
  }
};

export const generateAadhaarCardBack = async (
  tenantId: number,
  templatePath: string,
  address: string,
  careOf: string,
  aadhaarNumber: string,
  clientId: number,
) => {
  const U = "createAadhaar";
  const F = "generateAadhaarCardBack";
  try {
    const template = await loadImage(templatePath);
    const canvas = createCanvas(template.width, template.height);
    const ctx = canvas.getContext("2d");

    ctx.drawImage(template, 0, 0, template.width, template.height);

    ctx.font = "22px Arial";
    ctx.fillStyle = "black";
    
    ctx.fillText(`Address:`, 45, 150);
    const modifiedAddress = `${careOf}, ${address}`;

    const maxWidth = 450;
    const lineHeight = 30;
    const startX = 45;
    let startY = 180;

    const words = modifiedAddress.split(" ");
    let line = "";

    for (let n = 0; n < words.length; n++) {
        const testLine = line + words[n] + " ";
        const metrics = ctx.measureText(testLine);
        const testWidth = metrics.width;

        if (testWidth > maxWidth && n > 0) {
            ctx.fillText(line, startX, startY);
            line = words[n] + " ";
            startY += lineHeight;
        } else {
            line = testLine;
        }
    }

    ctx.fillText(`${line}`, startX, startY);

    ctx.font = "bold 25px Arial";
    ctx.fillText(`${aadhaarNumber}`, 250, 370);
    
    const buffer = canvas.toBuffer("image/png");

    // const occupancy = await occupancyDB.getByTenantId({
    //   tenantId,
    // });
    const occupancy = await occupancyDB.getByTenantIdAndClientId({
      tenantId,
      clientId
    });

    const folderName = `tenant_${occupancy.tenantId}`;
    const folderPath = `uploads/documents/client_${occupancy.clientId}/prop_${occupancy.propId}/room_${occupancy.roomId}_bed_${occupancy.bedId}/${folderName}`;
    const urlBase = folderPath.replace(
      "uploads/",
      `${process.env.UPLOAD_PATH}/`
    );

    if (!fs.existsSync(folderPath)) {
      await fsPromises.mkdir(folderPath, { recursive: true });
    }

    const fileName = `Aadhaar_Back.png`;
    fs.writeFileSync(`${folderPath}/${fileName}`, buffer as Uint8Array);
    const url = `${urlBase}/${fileName}`;

    log.info(`[${U}], [${F}], Client Id [${occupancy.clientId}], Tenant Id [${tenantId}], URL [${url}], Aadhaar Card Generated Successfully`)

    return {
      imageUrl: url,
      isSuccess: true,
    };
  } catch (error: any) {
    return {
      msg: CONSTANTS.MSG.ERROR_MESSAGE,
      isSuccess: false,
    };
  }
};
