import axios from 'axios';
import { Injectable } from '@nestjs/common';
import { ConfigurationService } from '../../config/configuration.service';
import { ErrorService } from '../../error/error.service';
import { ThirdPartyInsuranceInquiry } from './rayabimeh.interface';
import * as moment from 'jalali-moment';

@Injectable()
export class RayabimehService {
  private axios;
  private plateToNumber = {
    الف: 1,
    ب: 2,
    ت: 3,
    ج: 4,
    د: 5,
    س: 6,
    ص: 7,
    ط: 8,
    ع: 9,
    ق: 10,
    ل: 11,
    م: 12,
    ن: 13,
    و: 14,
    ه: 15,
    ی: 16,
    ر: 17,
    ک: 18,
    ژ: 19,
    پ: 20,
    ظ: 24,
    ض: 25,
    ز: 41,
    ش: 42,
    گ: 43,
    ث: 44,
    D: 45,
    S: 46,
    ح: 47,
    ف: 48,
  };

  public statuses = {
    '-1': 'فاقد بیمه نامه',
    0: 'صفر کیلومتر',
  };

  public companies = {
    1: 'بیمه ایران',
    2: 'بیمه البرز',
    3: 'بیمه پاسارگاد',
    4: 'بیمه دی',
    5: 'بیمه معلم',
    6: 'بیمه آسیا',
    7: 'بیمه پارسیان',
    8: 'بیمه سامان',
    9: 'بیمه دانا',
    10: 'بیمه سرمد',
    11: 'بیمه نوین',
    12: 'بیمه رازی',
    13: 'بیمه ملت',
    14: 'بیمه سینا',
    15: 'بیمه کارآفرین',
    16: 'بیمه تعاون',
    17: 'بیمه ما',
    18: 'بیمه کوثر',
    19: 'بیمه تجارت نو',
    20: 'بیمه آرمان',
    22: 'بیمه آسماری 21بیمه اتکایی ایرانیان',
    23: 'بیمه امید',
    24: 'بیمه ایران معین',
    25: 'بیمه خاورمیانه',
    26: 'بیمه توسعه',
    27: 'بیمه حافظ',
    28: 'بیمه میهن',
    29: 'اطمينان متحد قشم',
    30: 'بيمه متقابل كيش',
  };

  public carGroupsByVehicleId = {
    1: 'سواری',
    2: 'سواری',
    3: 'سواری',
    4: 'سواری',
    5: 'باری',
    6: 'باری',
    7: 'موتور',
    8: 'موتور',
    9: 'موتور',
    10: 'موتور',
    11: 'باری',
    12: 'باری',
    13: 'باری',
    14: 'باری',
    15: 'ون',
    16: 'ون',
    17: 'ون',
  };

  public carTypesByVehicleId = {
    1: 'پراید-پیکان-رنو-هیلمن',
    2: 'انواع 4 سیلندر',
    3: 'کمتر از 4 سیلندر',
    4: 'بیش از 4 سیلندر',
    5: 'بارکش تا 1 تن',
    6: 'از 1 تن تا 3 تن',
    7: 'موتور 1 سیلندر',
    8: 'موتور 2 سیلندر به بالا',
    9: 'موتور سایدبار 3 چرخ',
    10: 'موتور گازی',
    11: 'از 3 تن تا 5 تن',
    12: 'از 5 تن تا 10 تن',
    13: 'از 10 تن تا 20 تن',
    14: 'بیش از 20 تن',
    15: 'وسيله نقليه عمومی باظرفيت هفت تا پانزده نفر(استيشن،ون)',
    16: 'وسيله نقليه عمومی باظرفيت شانزده تابیست وشش نفر(ميني بوس)',
    17: '11 نفره',
  };

  public periodCodes = {
    100: 'یکساله',
    80: '9 ماهه',
    60: '6 ماهه',
    50: '5 ماهه',
    40: '4 ماهه',
    30: '3 ماهه',
    20: '2 ماهه',
    1: '1 ماهه',
  };

  public riskFactors = {
    1: 'شخصی',
    2: 'تاکسی درون شهری',
    3: 'تاکسی برون شهری',
    4: 'حمل مواد سوختی مایع و گازی شکل',
    5: 'حمل مواد منفجره و خطرناک',
    6: 'آموزش رانندگی',
    7: 'خودرو مسابقه',
    8: 'یدک کش',
    9: 'آژانس اینترنتی',
    10: 'بارکش',
  };

  constructor(
    private config: ConfigurationService,
    private error: ErrorService,
  ) {
    this.axios = axios.create({
      baseURL: 'https://rayabimeh.com',
    });
  }

  /**
   * -------------------------------
   * Inquiry
   */
  async thirdPartyInsuranceInquiry(
    plateNumber: string,
    nationalCode: string,
  ): Promise<ThirdPartyInsuranceInquiry> {
    try {
      const [plate_left, plate_alphabet, plate_right, Iran, plate_serial] =
        plateNumber.split('***');

      const { data } = await this.axios.post(
        '/api/v1/savari/plate-inquiry',
        null,
        {
          params: {
            plate_left,
            plate_right,
            plate_serial,
            owner_code_meli: nationalCode,
            plate_alphabet: this.plateToNumber?.[plate_alphabet] || '',
          },
        },
      );

      if (data?.status === 'failed') {
        throw 'اتصال به سازمان بیمه مرکزی برقرار نشد، دقایقی دیگر مجددا تلاش بفرمایید';
      }

      if (!data?.car_brand || data?.car_brand === 'اطلاعات موجود نمی باشد.') {
        throw 'اتصال به بیمه برقرار نشد، مجددا تلاش بفرمایید';
      }

      if (data.bime_ghabli_darad !== 'true') {
        return null;
      }

      return {
        startedAt: moment(data.bime_start_date, 'jYYYY/jMM/jDD').toDate(),
        expiredAt: moment(data.bime_expire_date, 'jYYYY/jMM/jDD').toDate(),
        companyName: data.old_company,
        companyCode: data.old_company_id,
        newInsurancePeriod: data.etebar_bime_jadid,
        riskFactor: +data.zarib_khatar,
        hasDamage: data.khesarat_darad === 'true',
        previousDiscount: data.takhfif_bime_ghabli,
        driverDiscount: data.takhfif_ranande,
        lifeDamageCount: data.tedad_khsarat_jani,
        financialDamageCount: data.tedad_khsarat_mali,
        driverDamageCount: data.tedad_khsarat_ranande,
        // car
        carMakerName: data.car_brand, // e.g. "سايپا"
        carMakerCode: +data.car_brand_id, // e.g. 90
        carGroup: data.car_groups, // e.g. "سواری"
        vehicleCode: +data.car_model_id, // e.g. 1
        carModelName: data.car_model, // e.g. "131SL"
        carMakeYear: data.makeDate, // e.g. "1391"

        // status: this.statusCodeToText?.[data.bime_ghabli_status] || null,
      };
    } catch (e) {
      console.log(
        'Rayabimeh catch',
        typeof e === 'string' ? e : e?.response?.data,
      );
      throw typeof e === 'string'
        ? e
        : 'اتصال به سازمان بیمه مرکزی برقرار نشد، دقایقی دیگر مجددا تلاش بفرمایید!';
    }
  }
}
