import fs from 'fs';
import path from 'path';
import Handlebars from 'handlebars';
import { Types } from 'mongoose';

import config from '@/shared/config/config';
import { Company } from '@/modules/company/company.model';
import { sendTransactionalEmail } from '@/shared/email/email.service';
import { SendEmailParams } from './email.interface';
import { ICompanyDoc } from '@/modules/company/company.interface';
import { TemplateName } from '@/shared/constants';

// Map Brevo template names to local file names
const TEMPLATE_MAP: Record<string, string> = {
  [TemplateName.EmailVerification]: 'setPassword.html',
  [TemplateName.AccountActivated]: 'accountActivated.html',
  [TemplateName.PartnerNetworkAccepted]: 'partnerNetworkAccepted.html',
  [TemplateName.LeadToCustomer]: 'leadToCustomer.html',
  [TemplateName.LeadAssigned]: 'leadsAssigned.html',
  [TemplateName.LeadReassigned]: 'leadReassigned.html',
  [TemplateName.CampaignStatus]: 'campaignStatus.html',
  [TemplateName.TasksAssigned]: 'tasksAssigned.html',
  [TemplateName.PartnerNetworkRequest]: 'partnerNetworkRequested.html',
  [TemplateName.SupportRequest]: 'supportRequest.html',
  [TemplateName.SupportResponse]: 'supportRequestResponse.html',
  [TemplateName.ResetPassword]: 'passwordResetSuccessfully.html',
  [TemplateName.ForgotPassword]: 'resetPassword.html',
  [TemplateName.PaymentDueReminder]: 'paymentDueReminder.html',
  [TemplateName.MyOperatorRequestAdmin]: 'myoperatorRequestAdmin.html',
};

export const syncEmailTemplates = async (
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  companyId: Types.ObjectId | string,
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  isDefault?: boolean,
) => {
  // Deprecated: No longer syncing with Brevo
  return true;
};

export const sendEmailWithActiveTemplate = async ({
  to,
  companyId,
  scenario,
  templateParams,
}: SendEmailParams) => {
  const isCampaignEmail = false;
  const company = (await Company.findById(companyId).select(
    'emailCredit',
  )) as ICompanyDoc;

  if (!company) {
    console.error(`Company not found for id ${companyId}`);
    return;
  }

  // Check email credits before sending
  if (!company.emailCredit || company.emailCredit <= 0)
    console.error(`Insufficient email credits for company ${companyId}`);
  // return;

  const templateFileName = TEMPLATE_MAP[scenario];
  if (!templateFileName) {
    console.error(`No local template found for scenario: ${scenario}`);
    return;
  }

  try {
    // Resolve template path
    const templatePath = path.join(
      process.cwd(),
      'src',
      'shared',
      'emailTemplate',
      templateFileName,
    );

    // Read and compile template
    const source = fs.readFileSync(templatePath, 'utf8');
    const template = Handlebars.compile(source);
    const htmlContent = template(templateParams);

    // Extract subject from template title or use a default
    // Simple regex to extract title tag content
    const titleMatch = source.match(/<title>(.*?)<\/title>/i);
    const subject = titleMatch ? titleMatch[1] : 'Notification from Makanify';

    // Send email
    const emailSent = await sendTransactionalEmail({
      to,
      subject,
      htmlContent,
      params: templateParams,
    });

    // Deduct email credit by 1 on successful send
    if (emailSent)
      await Company.findByIdAndUpdate(companyId, {
        $inc: { emailCredit: -1 },
      });
  } catch (error) {
    console.error(
      `Error sending email with template ${templateFileName}:`,
      error,
    );
  }
};
