import { Injectable } from "@nestjs/common";
import { EmailTemplatesService } from "../email-templates/email-templates.service";
import { Msg91Provider } from "./providers/msg91.provider";
import { EmailTemplateKey } from "./email.constants";

@Injectable()
export class EmailService {
  constructor(
    private readonly templatesService: EmailTemplatesService,
    private readonly msg91: Msg91Provider,
  ) {}

  private async send(
    key: EmailTemplateKey,
    to: string,
    variables: Record<string, any>,
    replyToEmail?: string,
  ) {
    const template = await this.templatesService.getByKey(key);
    return this.msg91.send(to, template.templateId, variables, replyToEmail);
  }

  private formatDateForEmail(date: string | Date | null | undefined): string {
    if (!date) return "";

    const d = new Date(date);

    if (isNaN(d.getTime())) return "";

    return d.toLocaleDateString("en-IN", {
      day: "2-digit",
      month: "short",
      year: "numeric",
    });
  }

  // ✅ Public APIs (clean)

  sendWelcomeEmail(user: any) {
    return this.send(EmailTemplateKey.WELCOME, user.email, {
      Customer_Name: user.name,
    });
  }

  sendInvoiceEmail(invoice: any) {
    return this.send(
      EmailTemplateKey.INVOICE,
      invoice.client_email,
      {
        Customer_Name: invoice.Customer_Name,
        Sender_Company_Name: invoice.Sender_Company_Name,
        Invoice_Number: invoice.Invoice_Number,
        Invoice_Amount: invoice.Invoice_Amount,
        Due_Date: this.formatDateForEmail(invoice.Due_Date),
        VAR1: invoice.Sender_Company_Name,
        // Invoice_Pdf_Url: invoice.invoice_pdf,
        Invoice_Pdf_Url: invoice.invoiceWeb,
        Invoice_Notes: invoice.notes,
        //here need to add notes and webview
      },
      invoice.replyTo || invoice.sender_email,
    );
  }

  sendInvoiceEmailToSender(invoice: any) {
    return this.send(EmailTemplateKey.INVOICE_SENT, invoice.user_email, {
      Customer_Name: invoice.Customer_Name,
      Sender_Company_Name: invoice.Sender_Company_Name,
      Invoice_Number: invoice.Invoice_Number,
      Invoice_Amount: invoice.Invoice_Amount,
      Due_Date: this.formatDateForEmail(invoice.Due_Date),
      VAR1: invoice.Customer_Name,
      Invoice_Notes: invoice.notes,
      Sender_Name: invoice.Sender_Company_Name,
      Invoice_Pdf_Url: invoice.invoiceWeb,
    });
  }

  sendEstimateEmail(estimate: any) {
    return this.send(
      EmailTemplateKey.ESTIMATE,
      estimate.client_email,
      {
        Customer_Name: estimate.Customer_Name,
        Sender_Company_Name: estimate.Sender_Company_Name,
        Estimate_Number: estimate.Estimate_Number,
        Estimate_Amount: estimate.Estimate_Amount,
        Valid_Until_Date: this.formatDateForEmail(estimate.valid_until),
        VAR1: estimate.Sender_Company_Name,
        Estimate_Link: estimate.estimateWebUrl,
        Estimate_Notes: estimate.Estimate_Notes,
      },
      estimate.replyTo || estimate.Sender_Email,
    );
  }

  // sendEstimateAcceptEmail(estimate: any) {
  //   return this.send(
  //     EmailTemplateKey.ESTIMATE_ACCEPTED,
  //     estimate.client_email,
  //     {
  //       Customer_Name: estimate.Customer_Name,
  //       Sender_Company_Name: estimate.Sender_Company_Name,
  //       Estimate_Number: estimate.Estimate_Number,
  //       Estimate_Amount: estimate.Estimate_Amount,
  //       Valid_Until_Date: this.formatDateForEmail(estimate.valid_until),
  //       VAR1: estimate.Sender_Company_Name,
  //       // Invoice_Pdf_Url: estimate.invoice_pdf,
  //     },
  //   );
  // }

  async sendOtpMail(user: any) {
    return this.send(EmailTemplateKey.OTP, user.email, {
      otp: user.otp,
      company_name: "InvoiceG2G",
    });
  }

  sendEstimateAcceptedEmail(estimate: any) {
    return this.send(EmailTemplateKey.ESTIMATE_ACCEPTED, estimate.user_email, {
      Estimate_Number: estimate.Estimate_Number,
      Estimate_Amount: estimate.Estimate_Amount,
      Valid_Until_Date: this.formatDateForEmail(estimate.valid_until),
      Customer_Name: estimate.Customer_Name,
      Sender_Name: estimate.Sender_Company_Name,
      Estimate_Link: estimate.estimate_url,
    });
  }

  sendEstimateRejectedEmail(estimate: any) {
    return this.send(EmailTemplateKey.ESTIMATE_REJECTED, estimate.user_email, {
      Estimate_Number: estimate.Estimate_Number,
      Estimate_Amount: estimate.Estimate_Amount,
      Valid_Until_Date: this.formatDateForEmail(estimate.valid_until),
      Customer_Name: estimate.Customer_Name,
      Sender_Name: estimate.Sender_Company_Name,
      Estimate_Link: estimate.estimate_url,
    });
  }

  sendInvoiceDueReminderEmail(invoice: any) {
    return this.send(
      EmailTemplateKey.INVOICE_REMINDER,
      invoice.client_email,
      {
        Customer_Name: invoice.Customer_Name,
        Sender_Company_Name: invoice.Sender_Company_Name,
        Invoice_Number: invoice.Invoice_Number,
        Invoice_Amount: invoice.Invoice_Amount,
        Due_Date: this.formatDateForEmail(invoice.Due_Date),
        VAR1: invoice.Customer_Name,
        Invoice_Link: invoice.invoice_pdf,
      },
      invoice.replyTo || invoice.sender_email,
    );
  }

  sendInvoicePaidEmailToSender(invoice: any) {
    return this.send(
      EmailTemplateKey.INVOICE_PAID_SENDER,
      invoice.sender_email,
      {
        Customer_Name: invoice.Customer_Name,
        Sender_Company_Name: invoice.Sender_Company_Name,
        Invoice_Number: invoice.Invoice_Number,
        Invoice_Amount: invoice.Invoice_Amount,
        Due_Date: this.formatDateForEmail(invoice.Due_Date),
        VAR1: invoice.Sender_Company_Name,
        Invoice_Link: invoice.Invoice_View_Url,
        Sender_Name: invoice.Sender_Company_Name,
      },
      invoice.sender_email,
    );
  }

  sendInvoicePaidEmailToCustomer(invoice: any) {
    return this.send(
      EmailTemplateKey.INVOICE_PAID_CUSTOMER,
      invoice.client_email,
      {
        Customer_Name: invoice.Customer_Name,
        Sender_Company_Name: invoice.Sender_Company_Name,
        Sender_Name: invoice.Sender_Name,
        Invoice_Number: invoice.Invoice_Number,
        Invoice_Amount: invoice.Invoice_Amount,
        Due_Date: this.formatDateForEmail(invoice.Due_Date),
        VAR1: invoice.Sender_Company_Name,
        Invoice_Link: invoice.Invoice_View_Url,
      },
      invoice.replyTo || invoice.sender_email,
    );
  }

  //  sendInvoiceDueTodayEmailToCustomer(invoice: any) {
  //   return this.send(
  //     EmailTemplateKey.INVOICE_DUE_TODAY,
  //     invoice.client_email,
  //     {
  //       Customer_Name: "{VALUE_FOR_CUSTOMER_NAME}",
  //       Invoice_Number: {VALUE_FOR_INVOICE_NUMBER},
  //       Invoice_Amount: {VALUE_FOR_INVOICE_AMOUNT},
  //       Due_Date: {VALUE_FOR_DUE_DATE},
  //       Invoice_Pdf_Url: {VALUE_FOR_INVOICE_PDF_URL},
  //       Sender_Name: {VALUE_FOR_SENDER_NAME}
  //     },
  //   );
  // }
}
