// Angular Core
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

// Services
import { ApiService } from '../api/api.service';

// Interfaces
import { SearchData } from 'src/app/interfaces/common-interfaces';

@Injectable({
  providedIn: 'root'
})
export class OrdersService {

  constructor(private http: HttpClient, public api: ApiService) { }

  /**
   * Maps tracking Id to courier service
   * @returns {object} Tracking object initialized for validation
   */
  trackingUrlExpressions() {
    return [
      //UPS - UNITED PARCEL SERVICE
      {
        url: 'http://wwwapps.ups.com/WebTracking/processInputRequest?TypeOfInquiryNumber=T&InquiryNumber1=',
        reg: /\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|T\d{3} ?\d{4} ?\d{3})\b/i
      },

      //USPS - UNITED STATES POSTAL SERVICE - FORMAT 1
      {
        url: 'https://tools.usps.com/go/TrackConfirmAction?qtc_tLabels1=',
        reg: /\b((420 ?\d{5} ?)?(91|92|93|94|01|03|04|70|23|13)\d{2} ?\d{4} ?\d{4} ?\d{4} ?\d{4}( ?\d{2})?)\b/i
      },

      //USPS - UNITED STATES POSTAL SERVICE - FORMAT 2
      {
        url: 'https://tools.usps.com/go/TrackConfirmAction?qtc_tLabels1=',
        reg: /\b((M|P[A-Z]?|D[C-Z]|LK|E[A-C]|V[A-Z]|R[A-Z]|CP|CJ|LC|LJ) ?\d{3} ?\d{3} ?\d{3} ?[A-Z]?[A-Z]?)\b/i
      },

      //USPS - UNITED STATES POSTAL SERVICE - FORMAT 3
      {
        url: 'https://tools.usps.com/go/TrackConfirmAction?qtc_tLabels1=',
        reg: /\b(82 ?\d{3} ?\d{3} ?\d{2})\b/i
      },

      //FEDEX - FEDERAL EXPRESS
      {
        url: 'https://www.fedex.com/fedextrack/?trknbr=',
        reg: /\b(((96\d\d|6\d)\d{3} ?\d{4}|96\d{2}|\d{4}) ?\d{4} ?\d{4}( ?\d{3})?)\b/i
      },

      //ONTRAC
      {
        url: 'http://www.ontrac.com/trackres.asp?tracking_number=',
        reg: /\b(C\d{14})\b/i
      },

      //DHL
      {
        url: 'http://www.dhl.com/content/g0/en/express/tracking.shtml?brand=DHL&AWB=',
        reg: /\b(\d{4}[- ]?\d{4}[- ]?\d{2}|\d{3}[- ]?\d{8}|[A-Z]{3}\d{7})\b/i
      }
    ];

  };

  /**
   * Get User Purchases Data
   * @returns {object} promise
   */
  getUserPurchasesData(ordersType: string, pageNumber: number, searchParams: SearchData) {
    var data = {};

    data = {
      "action": ordersType,
      "pageNumber": pageNumber,
      "limit": 100,
      "searchParams": searchParams
    };
    return this.api.create('/User-ManagePurchases', data);
  };

  /**
   * sends respose to api service for handling
   * @param {object} response object
   * @returns {undefined}
   */
  errorCallBack(response: any) {
    this.api.errorCallback(response);
  };

  /**
   * Get Order Request Information
   * @returns {object} promise
   */
  orderRequestInfo(requestType: string, sellerId: number, orderId: number, status: string | number | undefined, message: string) {
    var data = {};

    data = {
      "requestType": requestType,
      "supplierId": sellerId,
      "orderId": orderId,
      "paymentStatus": status,
      "message": message
    };
    return this.api.create('/User-OrderRequestInfo', data);
  };

  /**
   * Returns supplier's orders
   * @param {object} args
   * @returns {object} promise
   */
  getSupplierOrders(args: {}) {
    return this.api.create('/Supplier-ConfirmOrders', args);
  };

  /**
   * Update Order details.
   * @param {object} args
   * @returns {object} promise
   */
  updateOrders(args: {}) {
    return this.api.create('/Supplier-UpdateOrders', args);
  };

  /*
   * Get Supplier Messages Information
   * @returns {object} promise
   */
  getSupplierMessages(requestType:string, buyerId:number, orderId:number, message:string) {
    var data = {};

    data = {
      "requestType": requestType,
      "buyerId": buyerId,
      "orderId": orderId,
      "message": message
    };
    return this.api.create('/Supplier-ConfirmOrders', data);
  };

  /**
   * Returns supplier's order status list
   * @returns {object} promise
   */
  getOrderStatusList() {
    return this.api.read('/Supplier-ConfirmOrders');
  };

  /**
   * Returns document requested
   * @param {string} doc
   * @param {int} supplierId
   * @returns {object} promise
   */
  viewUniversalApp(doc: string, supplierId: number) {
    var data = {
      document: doc,
      userId: supplierId
    };
    return this.api.create('/ManageSupplier', data);
  };

  /**
   * inserting tracking number for transaction
   * @param int orderId
   * @param string trackingNumber
   * @param array transactionIds
   * @returns {object} promise
   */
  insertTrackingNumber(orderId: number, trackingNumber: string, transactionIds: []) {
    var data = {
      orderId: orderId,
      trackingNumber: trackingNumber,
      transactionIds: transactionIds
    };
    return this.api.create('/Supplier-ConfirmOrders/insertTrackingNumber', data);
  };

  /**
   * Updating tracking number
   * @param string trackingId
   * @param int shippingId
   * @param int transactionId
   * @param int orderId
   * @returns {object} promise
   */
  updateTrackingNumber(trackingId: string, shippingId: number, transactionId: number, orderId: number) {
    var data = {
      shippingId: shippingId,
      trackingNumber: trackingId,
      transactionId: transactionId,
      orderId: orderId
    };
    return this.api.create('/Supplier-ConfirmOrders/updateTrackingNumber', data);
  };

  /**
   * Removing tracking number
   * 
   * @param int shippingId
   * @param int transactionId
   * 
   * @returns {object} promise
   */
  removeTrackingNumber(shippingId: number, transactionId: number) {
    var data = {
      shippingId: shippingId,
      transactionId: transactionId
    };
    return this.api.create('/Supplier-ConfirmOrders/removeTrackingNumber', data);
  };

  /**
   * Returns supplier's order status list
   * @returns {object} promise
   */
  getStatusList() {
    return this.api.read('/User-ManagePurchases/getOrderStatusList');
  };

  /**
   * Submit payment method details
   * @param orderId
   * @param paymentMethodId
   * @param payType
   * @returns Observable
   */
  submitPayment(orderId: number, paymentMethodId: string, payType : string) {
    var data = {
        order_id: orderId,
        payment_method_id: paymentMethodId,
        pay_type: payType
    };
    return this.api.create('/User-ManagePurchases/submitPayment', data);
  }
  
  /**
    * Gets Order Payment method surcharge amount
    * @param orderId
    * @param paymentMethodId
    * @returns Observable
   */
  getPaymentMethodSurcharge(orderId: number, paymentMethodId: string) {
      var data = {
        order_id: orderId,
        payment_method_id: paymentMethodId
    };
    return this.api.create('/User-ManagePurchases/getPaymentMethodSurcharge', data);
  }

  /**
   * Call resend edi action.
   * @param orderId 
   * @returns Observable
   */
  resendEdi(orderId: number) {
    return this.api.read('/Supplier-ConfirmOrders/resendEdi?orderId='+orderId);
  };
  
  /**
   * Call check Phone Number action.
   * @param phonenumber 
   * @returns Observable
   */
  checkPhoneNumber(phoneNo: string, npi: string) {
    var data = {
      phoneNo: phoneNo,
      npi: npi
    };
    return this.api.create('/Supplier-Text', data);
  };
}
