import axios from 'axios';
import { Injectable } from '@nestjs/common';
import { ConfigurationService } from '../../config/configuration.service';
import { ErrorService } from '../../error/error.service';
import {
  AdvancedDrivingOffenseInquiry,
  AdvancedNegativeScoreInquiry,
  BasicDrivingOffenseInquiry,
  GetDrivingOffenseImage,
  NegativeScoreInquiry,
} from './venesh.interface';

@Injectable()
export class VeneshService {
  private axios;
  private plateToNumber = {
    ب: '02',
    ت: '03',
    ج: '04',
    د: '05',
    س: '06',
    ص: '07',
    ط: '08',
    ع: '09',
    ق: '10',
    ل: '11',
    م: '12',
    ن: '13',
    و: '14',
    ه: '15',
    ی: '16',
    ژ: '19',
  };

  constructor(
    private config: ConfigurationService,
    private error: ErrorService,
  ) {
    this.axios = axios.create({
      baseURL:
        config.thirdParty.veneshMode === 'sandbox'
          ? 'https://venesh.ir/sandbox'
          : 'https://venesh-api.ir',
    });
  }

  /**
   * -------------------------------
   * await this.veneshService.login()
   */
  async login() {
    try {
      const { data } = await this.axios.post('/oauth/token', {
        username: this.config.thirdParty.veneshUsername,
        password: this.config.thirdParty.veneshPassword,
        grant_type: 'password',
        client_id: this.config.thirdParty.veneshClientId,
        client_secret: this.config.thirdParty.veneshClientSecret,
      });

      this.axios.defaults.headers.common.Authorization = `${data.token_type} ${data.access_token}`;
      return data;
    } catch (e) {
      console.log('Venesh login catch', e?.response?.data || e);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   * Basic
   */
  async basicDrivingOffenseInquiry(
    nationalCode: string,
    mobile: string,
    plateNumber: string,
  ): Promise<BasicDrivingOffenseInquiry> {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/Users/Basic/DrivingOffenseInquiry',
        {
          NationalId: nationalCode,
          Mobile: mobile,
          Parameter: this._convertPlateToNumber(plateNumber),
        },
      );

      return data.Data;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   * Advanced
   */
  async advancedDrivingOffenseInquiry(
    nationalCode: string,
    mobile: string,
    plateNumber: string,
  ): Promise<AdvancedDrivingOffenseInquiry> {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/Users/Advanced/DrivingOffenseInquiry',
        {
          NationalId: nationalCode,
          Mobile: mobile,
          Parameter: this._convertPlateToNumber(plateNumber),
        },
      );

      return data.Data;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   */
  async getDrivingOffenseImage(
    imageId: number,
  ): Promise<GetDrivingOffenseImage> {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/Users/Advanced/GetDrivingOffenseImage',
        { imageId },
      );

      return data.Data;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   */
  async negativeScoreInquiry(
    licenseNumber: string,
  ): Promise<NegativeScoreInquiry> {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/NegativeScoreInquiry',
        { licenseNumber },
      );

      return data.Data;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   */
  async advancedNegativeScoreInquiry(
    licenseNumber: string,
    nationalCode: string,
    mobile: string,
  ): Promise<AdvancedNegativeScoreInquiry> {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/Users/Advanced/NegativeScoreInquiry',
        { licenseNumber, nationalId: nationalCode, Mobile: mobile },
      );

      return data.Data;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   * pay driving offense bill
   */
  async payDrivingOffenseBill(billId: string, payId: string) {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Banking/InstantBillPayment/DrivingOffense',
        {
          BillId: billId,
          PayId: payId,
        },
      );

      if (+data.Status === 0) {
        return true;
      }

      throw data.Message;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }

  /**
   * -------------------------------
   * personal plates inquiry
   */
  async personalPlatesInquiry(nationalCode: string, mobile: string) {
    await this.login();

    try {
      const { data } = await this.axios.post(
        '/api/Auth/v2/Law/Users/Advanced/PlatesInquiry',
        {
          NationalId: nationalCode,
          Mobile: mobile,
        },
      );

      console.log('data', data);

      if (+data.Status === 0) {
        return true;
      }

      throw data.Message;
    } catch (e) {
      console.log('Venesh catch', e?.response?.data || e);
      this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
    }
  }
  /**
   * -------------------------------
   */
  private _convertPlateToNumber(plate: string) {
    const splited = plate.split('***');

    const converted = this.plateToNumber?.[splited[1]] || null;
    if (!converted) {
      this.error.unprocessableEntity([
        'سرویسی برای این شماره پلاک قابل ارائه نمی باشد',
      ]);
    }

    return `${splited[4]}${converted}${splited[0]}${splited[2]}`;
  }

  /**
   * ======================= Service Disabled =======================
   */
  // async standardDrivingOffenseInquiry(
  //   nationalCode: string,
  //   mobile: string,
  //   vinCode: string,
  // ): Promise<DrivingOffenseInquiryBill[]> {
  //   try {
  //     const { data } = await this.axios.post(
  //       '/api/Auth/v2/Law/Users/Standard/DrivingOffenseInquiry',
  //       {
  //         NationalId: nationalCode,
  //         Mobile: mobile,
  //         Parameter: vinCode,
  //       },
  //     );

  //     return data.Data?.Bills;
  //   } catch (e) {
  //     console.log('Venesh catch', e?.response?.data);
  //     this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
  //   }
  // }

  /**
   * ======================= Service Disabled =======================
   */
  // async checkAuthentication(nationalCode: string, mobile: string) {
  //   try {
  //     const { data } = await this.axios.post(
  //       '/api/Auth/v2/Law/Users/RequestAuthentication',
  //       {
  //         InquiryType: 'standard',
  //         NationalId: nationalCode,
  //         Mobile: mobile,
  //       },
  //     );

  //     return data;
  //   } catch (e) {
  //     console.log('Venesh catch', e?.response?.data);
  //     this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
  //   }
  // }

  /**
   * ======================= Service Disabled =======================
   */
  // async verifyAuthentication(
  //   nationalCode: string,
  //   mobile: string,
  //   code: string,
  // ): Promise<VerifyAuthentication> {
  //   try {
  //     const { data } = await this.axios.post(
  //       '/api/Auth/v2/Law/Users/VerifyAuthentication',
  //       {
  //         InquiryType: 'standard',
  //         NationalId: nationalCode,
  //         Mobile: mobile,
  //         Code: code,
  //       },
  //     );

  //     return data.Data;
  //   } catch (e) {
  //     console.log('Venesh catch', e?.response?.data);
  //     this.error.internalServerError(['خطایی در اتصال به سرور رخ داده است']);
  //   }
  // }
}
