import { Types } from 'mongoose';

import { getSuperAdminCompanyId } from '@/modules/communication/fast2sms/fast2sms.helper';
import { sendWhatsAppTemplateMessage } from './metaUtil';
import { Whatsapp } from '@/modules/communication/whatsapp/whatsapp.model';
import { Company } from '@/modules/company/company.model';
import { ICompanyDoc } from '@/modules/company/company.interface';
import { TriggerPoint } from '../constants/enum.constant';
import config from '../config/config';

type TemplateVariables = Record<string, string> | string[];

interface SendWhatsappMessageParams {
  companyId: Types.ObjectId | string;
  triggerPoint: string;
  toNumber: string;
  variables?: TemplateVariables;
  isAuthenticationTemplate?: boolean;
  languageCode?: string;
  isNamedParams?: boolean;
}

export async function sendWhatsappMessage({
  companyId,
  triggerPoint,
  toNumber,
  variables,
  isAuthenticationTemplate = false,
  languageCode = 'en',
  isNamedParams = false,
}: SendWhatsappMessageParams) {
  const isLoginOTP = triggerPoint === TriggerPoint.OnLoginMobileApp;

  const company = (await Company.findById(companyId).select(
    'whatsapp whatsAppCredit',
  )) as ICompanyDoc | null;

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

  const hasCompanyWhatsapp = Boolean(
    company.whatsapp?.phoneNumberId && company.whatsapp?.accessToken,
  );

  const needsCredit = !hasCompanyWhatsapp && !isLoginOTP;

  // Credit check (single place)
  if (needsCredit && (!company.whatsAppCredit || company.whatsAppCredit <= 0)) {
    console.error(`Insufficient WhatsApp credits for company ${companyId}`);
    return false;
  }

  //  Resolve sender (company → super admin)
  let phoneNumberId = isLoginOTP ? config.whatsappTemplate.phoneNumberId : company.whatsapp?.phoneNumberId;
  let accessToken = isLoginOTP ? config.whatsappTemplate.accessToken : company.whatsapp?.accessToken;

  if(isLoginOTP){
    const superAdmin = (await getSuperAdminCompanyId()) as ICompanyDoc;
    companyId = superAdmin.id;
  }

  if (!phoneNumberId || !accessToken) {
    const superAdmin = (await getSuperAdminCompanyId()) as ICompanyDoc;

    if (
      !superAdmin?.whatsapp?.phoneNumberId ||
      !superAdmin?.whatsapp?.accessToken
    ) {
      console.error('No WhatsApp config available');
      return false;
    }

    phoneNumberId = superAdmin.whatsapp.phoneNumberId;
    accessToken = superAdmin.whatsapp.accessToken;
  }

  const templates = await Whatsapp.find({
    companyId,
    triggerPoint,
    status: 'active',
  });

  if (!templates.length) {
    console.error(`No active WhatsApp template for ${triggerPoint}`);
    return false;
  }

  const template =
    templates.find((t) => !t.isDefault) || templates.find((t) => t.isDefault);

  if (!template) {
    console.error('No suitable WhatsApp template found');
    return false;
  }

  const success = await sendWhatsAppTemplateMessage(
    toNumber,
    template.name,
    variables,
    isNamedParams,
    languageCode,
    isAuthenticationTemplate,
    accessToken,
    phoneNumberId,
  );

  if (success && needsCredit)
    await Company.findByIdAndUpdate(companyId, {
      $inc: { whatsAppCredit: -1 },
    });

  return success;
}
