import axios from 'axios';
import { Injectable } from '@nestjs/common';
import { ConfigurationService } from '../config/configuration.service';
import { removeSpace } from '../utils';

@Injectable()
export class SmsService {
  private axios;

  constructor(private config: ConfigurationService) {
    this.axios = axios.create({
      baseURL: `https://api.kavenegar.com/v1/${this.config.sms.kavenegarKey}`,
    });
  }

  async send(mobile, message) {
    return await this._simpleSend(mobile, message);
  }

  async sendServiceReminder(mobile, name, carModel, carNumber) {
    return await this._sendByTemplete('serviceReminder', mobile, [
      removeSpace(name, '.'),
      removeSpace(carModel, '.'),
      carNumber.split('***').join(''),
    ]);
  }

  async sendVerifyCode(mobile, codeRegister) {
    return await this._sendByTemplete('autotikverify', mobile, [codeRegister]);
  }

  async sendNotifySendServiceman(mobile, surName) {
    return await this._sendByTemplete('sendserviceman', mobile, [surName]);
  }

  async sendNotifyOrderToServiceman(
    mobile,
    orderNumber,
    dateTime,
    encryptedToken,
  ) {
    return await this._sendByTemplete('alertServiceManOrder', mobile, [
      orderNumber,
      dateTime,
      encryptedToken,
    ]);
  }

  async sendNotifyInvoice(mobile, surName, orderNumber) {
    return await this._sendByTemplete('sendfactor', mobile, [
      surName,
      orderNumber,
    ]);
  }

  async sendNotifyEndService(mobile, surName, kilometer) {
    return await this._sendByTemplete('endservice', mobile, [
      surName,
      kilometer,
    ]);
  }

  async sendNotifyProductQuantity(mobile, productName, productId) {
    return await this._sendByTemplete('productnotifquantity', mobile, [
      productName, // %token
      productId, // %token2
    ]);
  }

  async sendNotifAddOrderToCustomer(mobile, surName, orderNumber) {
    return await this._sendByTemplete('factor', mobile, [surName, orderNumber]);
  }

  async sendNotifAddServiceToCustomer(mobile, surName, dateTime, orderNumber) {
    return await this._sendByTemplete('service', mobile, [
      surName,
      dateTime,
      orderNumber,
    ]);
  }

  async sendSignupDiscount(
    mobile: string,
    name: string,
    couponCode: string,
    expireDate: string = null,
  ) {
    if (expireDate) {
      return await this._sendByTemplete('signupDiscountWithExpire', mobile, [
        removeSpace(name, '.'),
        couponCode,
        removeSpace(expireDate, '/'),
      ]);
    }

    return await this._sendByTemplete('signupDiscount', mobile, [
      removeSpace(name, '.'),
      couponCode,
    ]);
  }

  private async _simpleSend(mobile, message) {
    const params = { receptor: mobile, message };

    try {
      const { data } = await this.axios.get('/sms/send.json', {
        params,
      });

      return data;
    } catch (e) {
      return null;
    }
  }

  /**
   * -------------------------------------------------------
   */
  async notifyAdminForNewOrder(mobile, dateTime, orderNumber) {
    return await this._sendByTemplete('service', mobile, [
      orderNumber,
      dateTime,
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  async notifyCustomerForNewService(mobile, surName, orderNumber, dateTime) {
    return await this._sendByTemplete('alertAdmin', mobile, [
      surName,
      dateTime,
      orderNumber,
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  async notifyAdminForQuantityBelow(mobile, productId) {
    return await this._sendByTemplete('alertAdminQuantity', mobile, [
      productId,
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  async notifyCustomersForAllocateOilGovernment(
    mobile,
    surName,
    allocation,
    carNumber,
  ) {
    return await this._sendByTemplete(
      'notifyCustomersForAllocateOilGovernment', //kave negar
      mobile,
      [
        removeSpace(surName || '-', '.'),
        carNumber.split('***').join(''),
        allocation,
      ],
    );
  }

  /**
   * -------------------------------------------------------
   */
  async notifyCustomersForZeroAllocateForceOilGovernment(
    mobile,
    surName,
    carNumber,
  ) {
    return await this._sendByTemplete(
      'notifyCustomersForZeroAllocateOilGovernment', //kave negar
      mobile,
      [removeSpace(surName || '-', '.'), carNumber.split('***').join('')],
    );
  }

  /**
   * -------------------------------------------------------
   */
  async notifyCustomersForErrorAllocateForceOilGovernment(
    mobile,
    surName,
    carNumber,
  ) {
    return await this._sendByTemplete(
      'notifyCustomersForErrorOilGovernment', //kave negar
      mobile,
      [removeSpace(surName || '-', '.'), carNumber.split('***').join('')],
    );
  }

  /**
   * -------------------------------------------------------
   */
  private async _sendByTemplete(template, mobile, tokens = []) {
    const params = { template, receptor: mobile } as any;
    if (tokens[0]) params.token = removeSpace(tokens[0], '-');
    if (tokens[1]) params.token2 = removeSpace(tokens[1], '-');
    if (tokens[2]) params.token3 = removeSpace(tokens[2], '-');

    try {
      const { data } = await this.axios.get('/verify/lookup.json', {
        params,
      });

      console.log('SMS SUCCESS', mobile, template, data?.data);
      return data;
    } catch (e) {
      console.log('SMS ERROR', e?.response?.data);
      return null;
    }
  }
}
