import { Component, OnInit, NgZone, ViewChild, ElementRef } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { FormGroup, FormControl, Validators } from '@angular/forms';
import { ValidationService } from './../../provider/validation.service';
import { WebService } from './../../provider/web.service';
import { MapsAPILoader } from '@agm/core';
import { SubjectService } from './../../provider/subject.service';
import { google } from '@google/maps';
import { apiConfig } from '../../../environments/server.config';
import { ImageStorage } from '../../../environments/server.config';
import { formatDate } from '@angular/common';

declare var $;
declare const google: any;

@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.scss']
})
export class DashboardComponent implements OnInit {
  tab: any;
  loader: boolean;
  carModel: any;
  imageUrl: any;
  user_name: string;
  vehDetails: any;
  testMilage: any = '';
  errMessage: any;
  modelDates: number[] = new Array();
  monthArray: any[] = new Array(12);
  mechanics: string = ''; 
  editProfile;
  loginDetails: any;
  selectedFile: File;
  selMechanics: any[] = new Array();
  profile_image: any;
  mechCustQuote: number[] = new Array();
  confirmParam: string = '';
  confirmCallBak: string = '';
  cfautocomplete: any;
  searchLocError: boolean;
  bookingDetails: any;
  successBookDtls: any;
  profileEditResp: any;
  autocompleteVin: any;
  carBrands: any;
  selBrand: string = '';
  autocompleteDetails: any;
  optionalDescription: string;
  editProfileSubmitClick: boolean;
  remainders: any;
  
  vehicleVinAddForm;
  vehicleVinFormSubmitClick;
  
  vehicleDetailsAddForm;
  vehicleDetailsFormSubmitClick;
  
  //Default Map Location
  lat: number = 51.678418;
  lng: number = 7.809007;
  
  wizardData: any;
  
  //Vehicle Details: TAB 2
  vehicleDataForm;
  vehicleDataFormSubmit;
  
  //Service Details: TAB 3
  issuesData: any;
  defIssuesData: any[] = new Array();
  selectedIssues: any[] = new Array();
  
  //Quote Page
  step: number;
  today: any = new Date();
  currDate: any;
  currentDate: any;
  currentTime: any;
  nextDate: any;
  dateStep: number = 0;
  dateSection: any[] = new Array();
  serverUrl: string;
  imageServer: string;
  mechanicData: any;
  autoSchedule: boolean;
  showLeftArrow: boolean;
  showRightArrow: boolean;
  estimatedPrice: number;
  scheduleDateInit: boolean;
  googlesearchLocError: boolean;
  scheduleMechanic: any;
  optionalImges: any = new Array({1:false,2:false,3:false,4:false});
  
  vehiYear:any;
  vehiBrand:any;
  vehiModel:any;
  carTrim:any;

  imageDisp1: any;
  imageDisp2: any;
  imageDisp3: any;
  imageDisp4: any;
  //minRoute:any;
  
  @ViewChild("closeWizard") public closeWizardRef: ElementRef;
  @ViewChild("confirmModal") public confirmModalRef: ElementRef;
  @ViewChild("googleLocVin") public googleLocVinRef: ElementRef;
  @ViewChild("goTostep1") public goTostep1Ref: ElementRef;
  @ViewChild("failureModel") public failureModelRef: ElementRef;
  @ViewChild("successModel") public successModelRef: ElementRef;
  @ViewChild("step2nextBtn") public step2nextRef: ElementRef;
  @ViewChild("step3nextBtn") public step3nextRef: ElementRef;
  @ViewChild("closeQuoteWizard") closeQuoteWizardRef: ElementRef;
  @ViewChild("googleLocDetails") public googleLocDetailsRef: ElementRef;
  @ViewChild("newGoogleLocSearch") public newGoogleLocRef: ElementRef;
  @ViewChild("appointmentTab") public appointmentTabRef: ElementRef;
  @ViewChild("vehicleTab") public vehicleTabRef: ElementRef;
  @ViewChild("reminderTab") public reminderTabRef: ElementRef;
  @ViewChild("serviceHistoryTab") public serviceHistoryTabRef: ElementRef;
  @ViewChild("closeVehicleAddForm") public closeVehicleAddFormRef: ElementRef;
  
  public scrollbarOptions = { axis: 'y', theme: 'minimal-dark' };
  
  constructor(private router        : Router, 
    public ngZone         : NgZone,
    private route         : ActivatedRoute,
    public mapsAPILoader  : MapsAPILoader,
    public errorMsg       : ValidationService,
    public webService     : WebService,
    public subjectService : SubjectService) {
      this.step             		          = 0;
      this.currDate                       = new Date();
      this.nextDate                       = new Date();
      this.issuesData      	            	= false;
      this.loader                         = false;
      this.errMessage                     = false;
      this.vehDetails                     = false;
      this.mechanicData                   = false;
      this.serverUrl                      = apiConfig;
      this.imageServer                    = ImageStorage;
      this.searchLocError                 = false;
      this.showLeftArrow    	          	= false;
      this.showRightArrow   	          	= true;
      this.scheduleDateInit               = false;
      this.googlesearchLocError           = false;
      this.editProfileSubmitClick         = false;
      this.scheduleMechanic 	            = false; 
      this.optionalDescription 	          = ''; 
      this.vehicleDetailsFormSubmitClick  = false;  
    }
    
    ngOnInit() {
      this.currentTime = this.today.getTime();
      this.currentDate = this.today.getDate();
      
      this.tab = 'active';
      this.route.queryParams.subscribe(params => {
        let payStatus = params['status'];
        let activeTab = params['tab'];
        let vehTab = params['redrct_tab'];
        
        if(payStatus && payStatus !=''){
          if(payStatus == 'success')
          this.successModelRef.nativeElement.click();
          if(payStatus == 'failure')
          this.failureModelRef.nativeElement.click();
        }
        
        if(activeTab && activeTab !=''){
          if(activeTab == 'service'){
            this.serviceHistoryTabRef.nativeElement.click();
          }
          if(activeTab == 'appointment'){
            this.appointmentTabRef.nativeElement.click();
          }
        }

        if(vehTab && vehTab !=''){
          if(vehTab == 'vehicle'){
            this.vehicleTabRef.nativeElement.click();
          }
          if(vehTab == 'reminder'){
            this.reminderTabRef.nativeElement.click();
          }
        }
      });
      
      this.vehicleVinAddForm = new FormGroup({
        vin: new FormControl('', [Validators.required]), 
        location: new FormControl('', [Validators.required])
      });
      
      this.vehicleDetailsAddForm = new FormGroup({
        maker: new FormControl('', [Validators.required]), 
        location: new FormControl('', [Validators.required]), 
        modelYear: new FormControl('', [Validators.required]), 
        modelName: new FormControl('', [Validators.required]),
        engine: new FormControl(''),
        trim: new FormControl(''),
        last_date: new FormControl(''),
        maintanence_interval: new FormControl('')
      });
      
      this.getVehicleBrand();
      this.subjectService.getLoginData().subscribe(loginData => {
        this.loginDetails = JSON.parse(this.webService.getLocalStorageItem('userData'));
        
        if(this.loginDetails){
          this.imageUrl = ImageStorage+this.loginDetails.profile_image;
          this.editProfile = new FormGroup({
            email: new FormControl(this.loginDetails.email, [Validators.required, Validators.maxLength(50), Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$')]),
            phone: new FormControl(this.loginDetails.phone, [Validators.required, Validators.maxLength(15), Validators.pattern("^[0-9\ ( ) + , - ]+$")]),
            address: new FormControl(this.loginDetails.address, [Validators.required, Validators.maxLength(250)]),
            password: new FormControl('', [Validators.maxLength(16), Validators.minLength(6)]),
            cpassword: new FormControl('', [Validators.maxLength(16), Validators.minLength(6)]),
            last_name: new FormControl(this.loginDetails.last_name, [Validators.required, Validators.maxLength(50), Validators.pattern("^[a-zA-Z\ _ - ' \/]+$")]),
            first_name: new FormControl(this.loginDetails.first_name, [Validators.required, Validators.maxLength(50), Validators.pattern("^[a-zA-Z\ _ - ' \/]+$")])
          });
          this.getCustVehDetails();
          this.getCustBookDetails();
          this.getCustRemainders();
        } else {
          this.router.navigate(['index']);
        }
      });
      
      let currentYear = Number((new Date()).getFullYear());
      let startingYear = currentYear - 50;
      for (let date = currentYear ; date >= startingYear ; date --) {
        this.modelDates.push(date);
      }
      
      this.mapsAPILoader.load().then(() => {
        this.autocompleteVin = new google.maps.places.Autocomplete(this.googleLocVinRef.nativeElement, {
          types: ["address"]
        });
        this.autocompleteDetails = new google.maps.places.Autocomplete(this.googleLocDetailsRef.nativeElement, {
          types: ["address"]
        });
        this.cfautocomplete = new google.maps.places.Autocomplete(this.newGoogleLocRef.nativeElement, {
          types: ["address"]
        });
      });
      this.nextDate.setDate(this.nextDate.getDate() + 1);
      
      $('.modal-backdrop').remove();
      $('body').attr('class','');
      $('body').attr('style','');
    }

    getVehicleBrand(){
      this.loader = true;
      this.webService.get_data('getVehicleBrand').subscribe(response => { 
        if(response.status == 'success'){
          this.carBrands = response.data;
        }
        this.loader = false;
      });
    }
    
    get_vehiYear(year){
      if(year == ''){
        return;
      }
      this.carTrim = this.carModel = [];
      this.vehiYear = year;
      if(this.vehiBrand){
        this.get_model(this.vehiBrand);
      }
    }

    get_model(brand_id) {
      this.vehiBrand = brand_id;
      if(!this.vehiYear){
        return false;
      }
      this.carTrim = this.carModel = [];
      this.loader = true;
      const thisObj = this;
      thisObj.carBrands.forEach(function (brandData,index) {
        if(brandData.veh_brand_id == brand_id){
          thisObj.selBrand = brandData.maker;
        }
      });

      this.webService.post_data('getVehicleModel',{'vehBrand_id':brand_id,'type':0,'vehiYear':this.vehiYear}).subscribe(response => { 
        if(response.status == 'success'){
          this.carModel = response.data;
        }
        this.loader = false;
      });
    }
    
    get_trims(event){
      const model = event.target.options[event.target.selectedIndex].getAttribute('modelValue');
      this.loader = true;
      this.webService.post_data('getVehicleTrim',{'vehBrand_id':this.vehiBrand,'vehiYear':this.vehiYear,'vehiModel':model}).subscribe(response => { 
        if(response.status == 'success'){
          this.carTrim = response.data;
        }
        this.loader = false;
      });
    }

    getCustRemainders(){
      this.webService.post_data('getCustRemainders',{'customer_id':this.loginDetails.customer_id}).subscribe(response => { 
        if(response.status == 'success'){
          this.remainders = response.data;
        }else{
          this.remainders = false;
        }
      });
    }
    
    getCustBookDetails(){
      this.loader = true;
      this.webService.post_data('getCustBookDetails', {'customer_id':this.loginDetails.customer_id}).subscribe(response => {
        if ( response.status == '1' && response.bookData != 'undefined' && response.bookData != undefined && response.bookData != 'null' && response.bookData != null ) {
          let bookings = response.bookData;
          let successBooking: any[] = new Array();
          let bookingDetails: any[] = new Array();
          
          bookings.forEach(function (book) {
            if(book.status == 0 || book.status == 1 || book.status == 6){
              successBooking.push(book);
            } else {
              bookingDetails.push(book);
            }
          });
          
          if(successBooking.length > 0){
            this.successBookDtls = successBooking;
          } else {
            this.successBookDtls = false;
          }
          
          if(bookingDetails.length > 0){
            this.bookingDetails = bookingDetails;
          } else {
            this.bookingDetails = false;
          }
        }
        this.loader = false;
      });
    }
    
    getCustVehDetails(){
      this.loader = true;
      this.webService.post_data('customerVechiles', {'customer_id':this.loginDetails.customer_id}).subscribe(response => {
        if ( response.status == '1' && response.vehData != '' && response.vehData != 'undefined' && response.vehData != undefined && response.vehData != 'null' && response.vehData != null ) {
          this.vehDetails = response.vehData;
        } else {
          this.vehDetails = false;
        }
        this.loader = false;
      });
    }

    changeReminder(custVehId,status){
      this.loader = true;
      this.webService.post_data('changeReminderStatus', {'customer_veh_id':custVehId,'status':status}).subscribe(response => {
        if ( response.status == 'success') {
          this.getCustVehDetails();
        }
        this.loader = false;
      });
    }
    
    setIssueSelected(event){
      let issue_id = event.target.attributes.issue_id.value;
      let sub_issue_id = event.target.attributes.sub_issue_id.value;
      
      const thisObj = this;
      let index = thisObj.selectedIssues.findIndex(x => x.sub_issue_id == sub_issue_id);
      if(index > -1){
        thisObj.selectedIssues.splice(index, 1);
      } else {
        thisObj.issuesData.forEach(function (issData) {
          if(issData.issue_id == issue_id){
            issData.sub_categories.forEach(function (subIssData) {
              if(subIssData.issue_cat_id == sub_issue_id){
                let issue = issData.issue, 
                issue_image = issData.issue_image,
                issue_category = subIssData.issue_category,
                issue_cat_image = subIssData.issue_cat_image,
                default_service_fee = subIssData.default_service_fee,
                default_description = subIssData.default_description;
                
                thisObj.selectedIssues.push({issue_id,sub_issue_id,issue,issue_image,issue_category,issue_cat_image,default_service_fee,default_description});
              }
            });
          }
        }); 
      }
      this.calculateEstimate();
    }
    
    calculateEstimate(){
      const thisObj = this;
      thisObj.estimatedPrice = 0;
      thisObj.selectedIssues.forEach(function (selIssues) {
        thisObj.estimatedPrice = thisObj.estimatedPrice + Number(selIssues.default_service_fee);
      });
    }
    
    get_newlocaion(lastLoc){
      this.cfautocomplete.addListener("place_changed", () => {
        this.ngZone.run(() => {
          let places: google.maps.places.PlaceResult = this.cfautocomplete.getPlace();
          if (places == undefined || places == null || places === undefined || places === null || 
            places.geometry == undefined || places.geometry == null || places.geometry === undefined || places.geometry === null || 
            places.formatted_address == undefined || places.formatted_address == null || places.formatted_address === undefined || places.formatted_address === null) {
              this.googlesearchLocError = true;
              return;
            }
            this.wizardData['pickup_data'] = {
              'disp_loc':places.name,
              'pickup_loc':places.formatted_address,
              'pickup_lat':places.geometry.location.lat(),
              'pickup_lng':places.geometry.location.lng()
            };
            this.googlesearchLocError = false;
            this.lat = places.geometry.location.lat();
            this.lng = places.geometry.location.lng();
          });
        })
      }
      
      get_newdate(lastdate){
        this.wizardData['vechile_info']['lastMaintanceDate']=formatDate(lastdate,'MM/dd/yyyy','en');
      }
      
      get_newmilage(event){
        this.wizardData['vechile_info']['milage']=event;
      }
      
      get_newmaintanence_date(newdate){
        this.wizardData['vechile_info']['maintanenceInterval']=newdate.target.value;
      }
      
      removeSelectedItem(issue_id,sub_issue_id){
        let index = this.selectedIssues.findIndex(x => x.sub_issue_id == sub_issue_id);
        if(index > -1){
          this.selectedIssues.splice(index, 1);
          
          $('[id="issue_'+issue_id+'_'+sub_issue_id+'"]').prop('checked', false);
        }
        if(this.selectedIssues.length == 0){
          this.goTostep1Ref.nativeElement.click();
        }
        this.calculateEstimate();
      }
      
      submitProfileEdit(data){
        if(this.editProfile.invalid){
          return false;
        }
        const This = this;
        this.loader = true;
        data.customer_id = this.loginDetails.customer_id;
        
        let formData: FormData = new FormData();
        formData.append('data', JSON.stringify(data));
        
        if(this.profile_image && this.profile_image != '' && this.profile_image != undefined && this.profile_image != 'undefined' && this.profile_image != null && this.profile_image != 'null'){
          formData.append('profile_image', this.profile_image);
        }
        
        this.webService.multipart_post('edit_customer_profile', formData).subscribe(response => {
          if ( response.status == '1') {
            const userData = this.webService.getLocalStorageItem('userData');
            this.webService.removeLocalStorageItem(userData);
            
            let ret_profile_image = (response.profile_image && response.profile_image != undefined && response.profile_image != 'undefined' && response.profile_image != null && response.profile_image != 'null')?response.profile_image:this.loginDetails.profile_image;
            this.imageUrl = ImageStorage+ret_profile_image;
            
            let newUserData = {"customer_id":this.loginDetails.customer_id,
            "phone":data.phone,
            "email":data.email,
            "address":data.address,
            "last_name":data.last_name,
            "first_name":data.first_name,
            "profile_image":ret_profile_image,
            "status":"1"}
            this.webService.setLocalStorageItem('userData', JSON.stringify(newUserData));
            
            response.status = 'success';
            this.profileEditResp = response;
            this.loader = false;
          } else {
            response.status = 'error';
            response.message = (response.message == '')?this.errorMsg.errorList.req_failure:response.message; 
            
            this.profileEditResp = response;
            this.loader = false;
          }
        },error => {
          this.loader = false;
          this.profileEditResp = {'status':'error','message':this.errorMsg.errorList.req_failure};
        },() => {
          setTimeout( function() {
            This.profileEditResp = false;
          }, 2000)
        });
      }
      
      vehicleDetailsFormSubmit(vehicleData){
        if(this.vehicleDetailsAddForm.invalid){
          this.vehicleDetailsFormSubmitClick = true;
          return false;
        }
        let location;
        this.vehicleDetailsFormSubmitClick = false;
        vehicleData.car_maker = this.selBrand;
        this.ngZone.run(() => {
          let place: google.maps.places.PlaceResult = this.autocompleteDetails.getPlace();
          if (place == undefined || place == null || place === undefined || place === null || 
            place.geometry == undefined || place.geometry == null || place.geometry === undefined || place.geometry === null || 
            place.formatted_address == undefined || place.formatted_address == null || place.formatted_address === undefined || place.formatted_address === null) {
              this.searchLocError = true;
              return;
            }
            
            location = {'location':place.formatted_address,
            'location_lat':place.geometry.location.lat(),
            'location_lng':place.geometry.location.lng()
          };
        });
        
        this.addCustomerCar(1,vehicleData,location);
      }
      
      vehicleVinFormSubmit(vehicleData){
        if(this.vehicleVinAddForm.invalid){
          this.vehicleVinFormSubmitClick = true;
          return false;
        }
        
        let location;
        this.vehicleVinFormSubmitClick = false;
        this.ngZone.run(() => {
          let place: google.maps.places.PlaceResult = this.autocompleteVin.getPlace();
          if (place == undefined || place == null || place === undefined || place === null || 
            place.geometry == undefined || place.geometry == null || place.geometry === undefined || place.geometry === null || 
            place.formatted_address == undefined || place.formatted_address == null || place.formatted_address === undefined || place.formatted_address === null) {
              this.searchLocError = true;
              return;
            }
            
            location = {'location':place.formatted_address,
            'location_lat':place.geometry.location.lat(),
            'location_lng':place.geometry.location.lng()
          };
        });
        
        this.addCustomerCar(2,vehicleData,location);
      }
      
      addCustomerCar(type,vehicleData,location){
        vehicleData['lastMaintanceDate'] = (vehicleData['last_date'])?(formatDate(vehicleData['last_date'],'MM/dd/yyyy','en')):'';

        this.loader = true;
        let postData = {'type':type,'customer_id':this.loginDetails.customer_id,'vehicleData':vehicleData,'location':location};
        
        this.webService.post_data('addCustomerCar',postData).subscribe(response => {
          if ( response.status == '1' ) {
            this.getCustVehDetails();
            this.closeVehicleAddFormRef.nativeElement.click();
            this.resetVehicleForm();
            this.loader = false;
          } else {
            this.loader = false;
            this.errMessage = {'errMsg':response.message}
                setTimeout (() => {
                        this.errMessage = false;
                  }, 2000);
          }
        });
      }
      
      deleteCustomerCar(params){
        this.loader = true;
        this.webService.post_data('deleteCustomerCar', params).subscribe(response => {
          if ( response.status == '1' ) {
            this.getCustVehDetails();
            this.loader = false;
          }
        });
      }

      changeVehicleReminder(params){
        this.loader = true;
        this.webService.post_data('changeReminderStatus', params).subscribe(response => {
          if ( response.status == 'success' ) {
            this.getCustRemainders();
          }
          this.loader = false;
        });
      }
      
      optImgUpload(image_id,event){
        let reader = new FileReader();
        let optionalImg: any = event.target.files[0];
        
        reader.onloadend = () => {
          switch (image_id){
            case 1:
            this.optionalImges[1] = {'file':event.target.files[0],'file_url':reader.result};
            break;
            case 2:
            this.optionalImges[2] = {'file':event.target.files[0],'file_url':reader.result};
            break;
            case 3:
            this.optionalImges[3] = {'file':event.target.files[0],'file_url':reader.result};
            break;
            case 4:
            this.optionalImges[4] = {'file':event.target.files[0],'file_url':reader.result};
            break;
          }
        }
        reader.readAsDataURL(optionalImg);
      }
      
      imageUpload(e) {
        let reader = new FileReader();
        this.profile_image = e.target.files[0];
        reader.onloadend = () => {
          this.imageUrl = reader.result;
        }
        reader.readAsDataURL(this.profile_image);
      }
      
      resetVehicleForm(){
        this.vehicleVinAddForm.reset();
        this.vehicleDetailsAddForm.reset({
          maker: '', modelYear: '', modelName: '', location: '', last_date: '', maintanence_interval: '',engine: '',trim: ''
        });
      }
      
      routeToIndex(){
        this.router.navigate(["index"]);
      }
      
      bookVechile(customer_veh_id){
        this.loader = true;
        
        const thisObj = this;
        thisObj.vehDetails.forEach(function (vehData) {
          if(vehData.customer_veh_id == customer_veh_id){
            thisObj.wizardData = {'pickup_data': 
            {'pickup_loc':vehData.car_location,
            'pickup_lat':vehData.car_loc_lat,
            'pickup_lng':vehData.car_loc_lng
          }
        };
        
        thisObj.wizardData['vechile_info'] = {'trim':'','milage':'','emgine':'',
        'maker':vehData.car_maker,
        'modelName':vehData.car_model,
        'modelYear':vehData.car_model_year,
        'maintanenceInterval':vehData.maintanence_interval,
        'lastMaintanceDate':vehData.last_maintenance_date
      };
      
      thisObj.wizardData['customer_vehicle_id'] = vehData.customer_veh_id;
    }
  }); 
  this.getIssueData();
}

getIssueData(){
  const This = this;
  this.loader = true;
  this.webService.get_data('getGeneralIssues').subscribe(response => {
    if(response.status == '1'){
      this.issuesData = response.issue_data;
      this.defIssuesData = this.issuesData;
      this.loader = false;
    } else {
      this.loader = false;
      return false;
    }
  },error => {
    this.loader = false;
    return false;
  });
}

searchIssues(event){
  if(event.target.value == '' || event.target.value == 'undefined' || event.target.value == undefined || event.target.value == 'null' || event.target.value == null ){
    this.issuesData = this.defIssuesData;
  } else {
    const thisObj = this;
    let subCatArr: any;
    let data: any[] = new Array();
    let serRegExp = new RegExp(event.target.value,"gi");
    
    thisObj.defIssuesData.forEach(function (issues,index) {
      let issueCat = issues.issue;
      if(issueCat.search(serRegExp) != -1){
        data.push(thisObj.defIssuesData[index]);
      } else {
        subCatArr = issues.sub_categories;
        subCatArr.forEach(function (issues_cat) {
          let sub_issue_cat = issues_cat.issue_category;
          if(sub_issue_cat.search(serRegExp) != -1){
            data.push(thisObj.defIssuesData[index]);
          }
        });
      }
    });
    this.issuesData = (data.length > 0)?data:false;
  }
  
  setTimeout(()=>{
    this.selectedIssues.forEach(function (issues) {
      $('[id="issue_'+issues.issue_id+'_'+issues.sub_issue_id+'"]').prop('checked', true);
    });
  },500);
}

// searchIssues(event){
//   if(event.target.value == '' || event.target.value == 'undefined' || event.target.value == undefined || event.target.value == 'null' || event.target.value == null ){
//     this.issuesData = this.defIssuesData;
//   } else {
//     const thisObj = this;
//     let data: any[] = new Array();
//     let serRegExp = new RegExp(event.target.value,"gi");
//     thisObj.defIssuesData.forEach(function (issues,index) {
//       let issueCat = issues.issue;
//       let subIssueCat =issues.sub_categories;
//       if(issueCat.search(serRegExp) != -1){
//         thisObj.defIssuesData['exception'] = '0';
//         data.push(thisObj.defIssuesData[index]);
//       }else {
//         issues.sub_categories.forEach(function (issues_cat_1,index_1) {
//           let subIssueCat = issues_cat_1.issue_category;
//           if(subIssueCat.search(serRegExp) != -1){
//             thisObj.defIssuesData['exception'] = '1';
//             data.push(thisObj.defIssuesData[index]);
//           }
//         })
//       }
//     });
//     this.issuesData = (data.length > 0)?data:false;
//   }

//   setTimeout(()=>{
//     this.selectedIssues.forEach(function (issues) {
//       $('[id="issue_'+issues.issue_id+'_'+issues.sub_issue_id+'"]').prop('checked', true);
//     });
//   },500);
// }

jumpToStep3(){
  if(this.selectedIssues.length != 0){
    this.step3nextRef.nativeElement.click();
  }
}

getQuote(){
  const thisObj = this;
  this.loader = true;
  
  let selSubIssues: any[] = new Array();
  thisObj.selectedIssues.forEach(function (selIssues) {
    selSubIssues.push(selIssues.sub_issue_id);
  });
  let searchData = {'pickup_data':this.wizardData.pickup_data,'sub_issues':selSubIssues}
  this.webService.post_data('getNearByMechanics',searchData).subscribe(response => {
    if(response.status == '1'){
      this.mechanicData = response.mechanic_data;
      this.dateSection.push(new Date(this.today.setDate(this.today.getDate())));
      this.dateSection.push(new Date(this.today.setDate(this.today.getDate() + 1)));
      
      this.loader = false;
    } else {
      this.mechanicData = false;
      this.loader = false;
      return false;
    }
  },error => {
    this.loader = false;
    return false;
  });
}

onMouseOver(infoWindow, gm) {
  if (gm.lastOpen != null) {
    gm.lastOpen.close();
  }
  gm.lastOpen = infoWindow;
  infoWindow.open();
}

onMouseOut(gm){
  if (gm.lastOpen != null) {
    gm.lastOpen.close();
  }
}

next(event) {
  if(this.dateStep > 30){
    this.showLeftArrow = true;
    this.showRightArrow = false;
    return false;
  }
  this.showLeftArrow = true;
  this.showRightArrow = true;
  this.dateSection = new Array();
  this.nextDate.setDate(this.nextDate.getDate() + 1);
  this.currDate.setDate(this.currDate.getDate() + 1);
  this.dateSection[0] = new Date(this.currDate);
  this.dateSection[1] = new Date(this.nextDate);
  this.dateStep += 1;
}

prev(event) {
  if(this.dateStep <= 0){
    this.showLeftArrow = false;
    this.showRightArrow = true;
    return false;
  }
  this.showLeftArrow = true;
  this.showRightArrow = true;
  this.dateSection = new Array();
  this.nextDate.setDate(this.nextDate.getDate() - 1);
  this.currDate.setDate(this.currDate.getDate() - 1);
  this.dateSection[0] = new Date(this.currDate);
  this.dateSection[1] = new Date(this.nextDate);
  this.dateStep -= 1;
}

getSchedule(time,index){
  this.wizardData['schedule_date'] = {'date':this.formatDate(this.dateSection[index]),'time':time};
}

formatDate(date) {
  const d = new Date(date);
  let day = '' + d.getDate();
  let month = ''+(d.getMonth()+1);
  const year = d.getFullYear();
  if (day.length < 2) { day = '0'+day; }
  if (month.length < 2) { month = '0'+month; }
  return [year,month,day].join('-');
}

scheduleNow(mechanic_id,cost){
  this.wizardData['mechanic_id'] = mechanic_id+':'+cost;
  
  if(!this.loginDetails){
    this.routeToIndex();
  }
  this.loader = true;
  
  this.wizardData['cost'] = cost;
  this.wizardData['multiple'] ='0';
  this.confirmBooking();
}

scheduleMultipleRequest(){
  if(!this.loginDetails){
    this.routeToIndex();
  }
  let coma = '';
  const thisObj = this;
  this.mechanics = '';
  this.selMechanics.forEach(function (mechanic_data) {
    thisObj.mechanics += coma+mechanic_data.mechanic_id+':'+mechanic_data.amount; 
    coma = ',';
  })      
  this.wizardData['mechanic_id'] = thisObj.mechanics;
  this.wizardData['cost'] = this.estimatedPrice;
  this.wizardData['multiple'] ='1';
  this.confirmBooking();
}

confirmBooking(){
  this.wizardData['customer_id'] = this.loginDetails.customer_id;
  this.wizardData['selected_issues'] = this.selectedIssues;
  this.wizardData['optionalDescription'] = this.optionalDescription;
  
  let formData: FormData = new FormData();
  formData.append('data', JSON.stringify(this.wizardData));
  
  this.optionalImges.forEach(function (imgData,index) {
    if(!imgData){
      return true;
    }
    formData.append("optFile_" + (index), imgData.file);
  });
  
  this.webService.multipart_post('scheduleNow', formData).subscribe(response => {
    // this.webService.post_data('scheduleNow',this.wizardData).subscribe(response => {
    if(response.status == '1'){
      this.closeWizardRef.nativeElement.click();
      this.closeQuoteWizardRef.nativeElement.click();
      
      this.goTostep1Ref.nativeElement.click();
      this.selectedIssues = [];
      
      this.appointmentTabRef.nativeElement.click();
      
      this.getCustBookDetails();
    } else {
      this.loader = false;
      return false;
    }
  },error => {
    this.loader = false;
    return false;
  });
}

resetQuoteWizard(){
  this.selectedIssues = [];
  this.scheduleMechanic = false;
  this.scheduleDateInit = false;
  this.goTostep1Ref.nativeElement.click();
  
  this.optionalImges[1] = false;
  this.optionalImges[2] = false;
  this.optionalImges[3] = false;
  this.optionalImges[4] = false;
  this.optionalDescription = '';
}

showCustQuote(booking_id,mechanic_id,type){
  if(!booking_id || !mechanic_id){
    return false;
  }
  this.loader = true;
  const thisObj= this;
  
  if(type == '2'){
    thisObj.successBookDtls = this.bookingDetails;
  }
  thisObj.successBookDtls.forEach(function (data,index) {
    if(data.booking_id == booking_id){
      // let bookdata = data;
      data.mechanic_data.forEach(function (mechdata,mechindex) {
        if(mechdata.mechanic_id == mechanic_id){
          let mechdatadetails = mechdata;
          thisObj.mechCustQuote = mechdatadetails.custom_service_quote;
        }
      })
    }
  });
  this.loader = false;
}

cancelBooking(booking: any){
  let bookingId: number;
  if(!booking.bookingId){
    return false;
  }
  bookingId = booking.bookingId;
  
  this.loader = true;
  this.webService.post_data('cancelBooking', {'customer_id':this.loginDetails.customer_id,'booking_id':bookingId}).subscribe(response => {
    if ( response.status == '1' ) {
      this.getCustBookDetails();
      this.loader = false;
    }
  });
}

purchase(carId){
  this.goToPage('productlist',{'car_id':carId})
}

mechanicQuoteAccept(event,booking_id,mechanic_id){
  if(!booking_id || !mechanic_id){
    return false;
  }
  
  let amount = event.target.attributes.bookAmount.value;
  this.showConfirmPopUp('acceptQuote',{bookingId:booking_id,mechanicId:mechanic_id,amount:amount});
}

cnfCancelBook(booking_id){
  if(!booking_id){
    return false;
  }
  this.showConfirmPopUp('cancelBooking',{bookingId:booking_id});
}

cnfdeleteCustomerCar(customer_id,vehicle_id){
  if(!customer_id || !vehicle_id){
    return false;
  }
  this.showConfirmPopUp('deleteCustomerCar',{'customer_id':customer_id,'customer_veh_id':vehicle_id});
}

cnfdeleteVehReminder(customer_veh_id,status){
  if(!customer_veh_id){
    return false;
  }
  this.showConfirmPopUp('changeVehicleReminder',{'customer_veh_id':customer_veh_id,'status':status});
}

showConfirmPopUp(fn_name: string, param: any){
  if(fn_name === ''){
    return false;
  }
  if(param){
    param = JSON.stringify(param);
  }
  this.confirmParam = param;
  this.confirmCallBak = fn_name;
  this.confirmModalRef.nativeElement.click();
}

confirmCallBack(fn_name: string,param: string){
  if(fn_name === '' || !this[fn_name]){
    return false;
  }
  if(param !== ''){
    param = JSON.parse(param);
    this[fn_name](param);
  } else {
    this[fn_name]();
  }
}

acceptQuote(param: any){
  this.loader=true;
  this.webService.post_data('acceptMechanicQuote',param).subscribe(response => {
    if(response.status == 'success'){
      document.location.href = this.serverUrl+'payNow/'+response.data;
      // this.getCustBookDetails();
    }else{
      this.loader = false;
      this.failureModelRef.nativeElement.click();
    }
  })
}

checkboxChange(index,mechanic_id,event,estimate){
  if (event.target.checked) {
    this.selMechanics.push({id:index,mechanic_id:mechanic_id,amount:estimate});
  } else {
    let id = this.selMechanics.findIndex(x => x.id == index);
    if (id != -1) {
      this.selMechanics.splice(id, 1);
    }
  }
}

goToPage(path,data=null){
  this.router.navigate([path],{queryParams:  data});
  document.body.scrollTop  =  document.documentElement.scrollTop  =  0;
}

scrollToTop(id){
  $('#'+id).stop().animate({scrollTop: 0}, 800);
}

scrollToBottom(id){
  $('#'+id).stop().animate({scrollTop: $('#'+id)[0].scrollHeight}, 1500);
}

tab_swap(type) { this.tab = type; }
}