import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup, Validators, FormControl, FormArray} from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import {ReplaySubject, Subject, Subscription} from 'rxjs';
import { ApiService } from '../../../../../core/api/api.service';
import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud';
import {GeneralResponseModel} from '../../models/general-response.model';
import {FiltrosServiciosResponseModel} from '../../models/filtros-servicios-response.model';
import moment from "moment";
import Utils from "../../../../../utils";
import {AuthService} from '../../../../../core/auth';

@Component({
	selector: 'kt-solicitudes-servicio-edit',
	templateUrl: './solicitudes-servicio-edit.component.html',
	styleUrls: ['./solicitudes-servicio-edit.component.scss']
})
export class SolicitudesServicioEditComponent implements OnInit {

	isLoading = false;

	//Search
	lastLength = 0;
	typingTimer;
	typingInterval = 700;

	generalForm: FormGroup;
	selectedTab = 0;
	subscriptions: Subscription[] = [];
	isNew = true;
	id = 0;

	filteredClients: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	filteredServices: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	filteredFormasPagos: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	filteredOrigenes: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	domiciliosCliente;
	origenes;
	servicios;
	tipoServicios;
	estatusServicios;
	fecha;
	horas;
	puede_editar = false;
	vehiculos = [];
	filteredVehiculos: Array<ReplaySubject<any[]>> = new Array<ReplaySubject<any[]>>(0);
	newVehiculos = [];
	asesores = [];
	filteredAsesores: Array<ReplaySubject<any[]>> = new Array<ReplaySubject<any[]>>(0);
	newAsesores = [];

	auxiliares1 = [];
	auxiliares2 = [];

	auxiliares = [];
	filteredAuxiliares1: Array<ReplaySubject<any[]>> = new Array<ReplaySubject<any[]>>(0);
	filteredAuxiliares2: Array<ReplaySubject<any[]>> = new Array<ReplaySubject<any[]>>(0);

	newAuxiliares = [];
	auxiliaresIds = ['auxiliar_1', 'auxiliar_2']

	respuestasSiNo = [
		{
			"value": "1",
			"name": "Si"
		},
		{
			"value": "0",
			"name": "No"
		}
	];

	recently = true;

	//input search filter
	isLoadingInputSearch = false;

	camposServicios;

	//CAMPO VALIDAR DISPONIBILIDAD
	solicitudServicioId = '';
	servicioDetId: number = null;
	isLoadingDisponibilidad = [];

	servicioID = null;

	disableAll = false;

	disableCheckBtn = false;

	usuarioAgendo = "";

	user_info;
	permiso_especial;

	constructor(private fb: FormBuilder,
		private router: Router,
		private layoutUtilsService: LayoutUtilsService,
		private activatedRoute: ActivatedRoute,
		private ref: ChangeDetectorRef,
		private api: ApiService,
		public auth: AuthService) {

		let routeSubscription = this.activatedRoute.params.subscribe(params => {
			this.servicioID = params.id;
			this.isNew = !(this.servicioID && this.servicioID > 0);
		});
		this.subscriptions.push(routeSubscription);

	}

	ngOnInit() {
		this.crearFormulario();
		this.crearFormularioServicio(this.generalForm);
		this.getFiltros();
		this.horas = this.generateHours();
		this.user_info = this.auth.getUser();
		this.permiso_especial = this.user_info.permiso_especial;
	}

	getServicio() {

		this.isLoading = true;

		if (!this.isNew) {
			this.disableEnableAll(true);

			this.api.solicitudesServicioService.show(this.servicioID).subscribe(servicio => {
				this.getOriginsFilter(servicio.origen_nombre);
				this.getClientFilter(servicio.cliente_id);
				this.getPaymentMethodsFilter(servicio.forma_pago_nombre);
				this.usuarioAgendo = servicio.usuario_agenda_nombre + ' ' + servicio.usuario_agenda_apellido_paterno + ' ' + servicio.usuario_agenda_apellido_materno

				let ser = [];

				servicio.servicios.forEach((servicio, index) => {

					if (index != 0)
						this.addServicio();

					let fechaSolicitud = servicio.fecha_solicitud.split(' ', 2);
					let horaSolicitud = fechaSolicitud[1].split(':',3);
					let duracion = servicio.duracion.split(':',3);
					this.getServiceFilter(servicio.servicio_nombre);

					servicio.servicio_id = Utils.toNumber(servicio.servicio_id);
					servicio.tipo_servicio_id = Utils.toNumber(servicio.tipo_servicio_id);
					servicio.estatus_servicio_id = Utils.toNumber(servicio.estatus_servicio_id);
					servicio.vehiculo_id = Utils.toNumber(servicio.vehiculo_id);
					servicio.operador_id = Utils.toNumber(servicio.operador_id);
					servicio.auxiliar_1_id = Utils.toNumber(servicio.auxiliar_1_id);
					servicio.auxiliar_2_id = Utils.toNumber(servicio.auxiliar_2_id);

					servicio.fecha_solicitud = this.dateFormat(fechaSolicitud[0]);
					servicio.hora_solicitud = horaSolicitud[0] + ':' + horaSolicitud[1];
					servicio.horas_duracion = Number(duracion[0]).toString();
					servicio.minutos_duracion = duracion[1];
					ser.push(servicio);
				});

				servicio.servicios = ser;

				// Asignar el ID del primer servicio detalle para el historial
				if (ser.length > 0 && ser[0].id) {
					this.servicioDetId = Number(ser[0].id);
				}

				//servicio.origen_id = this.origenes.find((item) => item.id == servicio.origen_id);
				//servicio.forma_pago_id = this.formasPago.find((item) => item.id == servicio.forma_pago_id);

				servicio.cliente_id = Utils.toNumber(servicio.cliente_id);
				servicio.origen_id = Utils.toNumber(servicio.origen_id);
				servicio.forma_pago_id = Utils.toNumber(servicio.forma_pago_id);

				this.generalForm.reset(servicio);
				this.generalForm.updateValueAndValidity();

				this.getDomiciliosCliente(servicio.cliente_id, servicio.cliente_domicilio_id);

				servicio.servicios.forEach((servicio, index) => {
					this.formatCurrency(servicio.costo_servicio, index);
					this.validarDisponibilidad(index, true,true, true,[],null,{
						vehiculo_id: servicio.vehiculo_id,
						operador_id: servicio.operador_id,
						auxiliar_1: servicio.auxiliar_1_id,
						auxiliar_2: servicio.auxiliar_2_id
					},servicio.puede_editar == 1);
				})

				this.disableEnableAll(false);

				servicio.servicios.forEach((servicio, index) => {
					if(servicio.puede_editar == 0){
						this.generalForm.get('cliente_id').disable();
						this.generalForm.get('cliente_domicilio_id').disable();
						this.generalForm.get('forma_pago_id').disable();
						this.generalForm.get('origen_id').disable();
						this.getArrayItemFormControlName('servicio_id', index).disable();
						this.getArrayItemFormControlName('tipo_servicio_id', index).disable();
						this.getArrayItemFormControlName('estatus_servicio_id', index).disable();
						this.getArrayItemFormControlName('fecha_solicitud', index).disable();
						this.getArrayItemFormControlName('minutos_duracion', index).disable();
						this.getArrayItemFormControlName('horas_duracion', index).disable();
						this.getArrayItemFormControlName('hora_solicitud', index).disable();
						this.getArrayItemFormControlName('costo_servicio', index).disable();
						this.getArrayItemFormControlName('observacion_atencion_cliente', index).disable();
						this.getArrayItemFormControlName('facturado', index).disable();
						this.getArrayItemFormControlName('requiere_encuesta', index).disable();
						this.getArrayItemFormControlName('definido_cliente', index).disable();
						this.getArrayItemFormControlName('operador_id', index).disable();
						this.getArrayItemFormControlName('vehiculo_id', index).disable();
						this.generalForm.updateValueAndValidity();
						this.disableCheckBtn = true;
					}else if(servicio.puede_editar == 2){
						this.generalForm.get('cliente_id').disable();
						this.generalForm.get('cliente_domicilio_id').disable();
						this.getArrayItemFormControlName('fecha_solicitud', index).disable();
						this.generalForm.updateValueAndValidity();
						this.disableCheckBtn = true;
					}
				})

				this.isLoading = false;
			});
		} else {
			this.isLoading = false;
			this.disableEnableAll(false);
		}
	}

	dateFormat(date){
		let d = new Date(date);
		d.setDate(d.getDate() + 1);
		return d;
	}

	crearFormulario() {
		this.generalForm = this.fb.group({
			cliente_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			cliente_domicilio_id: new FormControl({value: null, disabled: true}, [Validators.required]),
			forma_pago_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			origen_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			servicios: new FormArray([])
		});
	}

	crearFormularioServicio(form: FormGroup): any {
		let control = form.controls.servicios as FormArray;
		this.camposServicios = control.controls;
		this.addServicio();
	}

	addServicio(){
		if(this.camposServicios.length != 3){
			let controls = this.generalForm.get('servicios') as FormArray;
			controls.push(this.initCampo());
			this.isLoadingDisponibilidad.push(false);
		}
	}

	deleteService(index){
		if(this.camposServicios.length > 1) {
			let controls = this.generalForm.get('servicios') as FormArray;
			controls.removeAt(index);
			this.isLoadingDisponibilidad.splice(index, 1);
		}
	}

	initCampo = (): FormGroup => {
		return this.fb.group({
			id: new FormControl({value: null, disabled: false}, []),
			servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			tipo_servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			estatus_servicio_id: new FormControl({value: null, disabled: false}, [Validators.required]),
			vehiculo_id: new FormControl({value: null, disabled: true}, [Validators.required]),
			operador_id: new FormControl({value: null, disabled: true}, [Validators.required]),
			costo_servicio: new FormControl({value: null, disabled: false}, [Validators.required, Validators.pattern(/^[$\-\s]*[\d\,]*?([\.]\d{0,2})?\s*$/)]),
			observacion_atencion_cliente: new FormControl({value: null, disabled: false}, [Validators.max(700)]),
			definido_cliente: new FormControl({value: 1, disabled: false}, [Validators.required]),
			requiere_encuesta: new FormControl({value: 1, disabled: false}, [Validators.required]),
			facturado: new FormControl({value: 1, disabled: false}, [Validators.required]),
			fecha_solicitud: new FormControl({value: '', disabled: false}, [Validators.required]),
			hora_solicitud: new FormControl({value: '', disabled: false}, [Validators.required]),
			horas_duracion: new FormControl({value: '', disabled: false}, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]),
			minutos_duracion: new FormControl({value: '', disabled: false}, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]),
			auxiliar_1: new FormControl({value: null, disabled: true}, []),
			auxiliar_2: new FormControl({value: null, disabled: true}, []),
		});
	};

	changeNoFoundLabel(){
		return this.isLoadingInputSearch ? 'Espere un momento...' :  'No se encontraron resultados';
	}

	isControlHasError(controlName: string, validationType: string): boolean {
		let control = this.generalForm.controls[controlName];
		if (!control) {
			return false;
		}
		return control.hasError(validationType) && (control.dirty || control.touched);
	}

	onKeyUp(ev, tipo) {
		let text = ev.target.value;
		if(text != ''){
			this.isLoadingInputSearch = true;
			clearTimeout(this.typingTimer);
			this.typingTimer = setTimeout(() => {
				switch (tipo){
					case 'client': { this.getClientFilter(text); break; }
					case 'paymentMethod': { this.getPaymentMethodsFilter(text); break; }
					case 'origins': { this.getOriginsFilter(text); break; }
				}
			}, this.typingInterval);
		}else{
			this.isLoadingInputSearch = false;
		}
	}

	onKeyUpManual(ev, tipo, index, formControl = null) {
		let text = ev.target.value;

		if(text != ''){
			this.recently = false;
		}

		if(!this.recently){
			this.isLoadingInputSearch = true;
			clearTimeout(this.typingTimer);
			this.typingTimer = setTimeout(() => {

				switch (tipo){
					case 'vehicle': { this.getVehicleFilter(text, index); break; }
					case 'consultant': { this.getConsultantFilter(text, index); break; }
					case 'auxiliar': { this.getAuxiliarFilter(text, index, formControl); break; }
					case 'service': { this.getServiceFilter(text); break; }
				}

				if(text == ''){
					this.recently = true;
				}

			}, this.typingInterval);
		}else{
			this.isLoadingInputSearch = false;
		}

	}

	getClientFilter(query = null){
		this.api.solicitudesServicioService.filtros('clientes?query='+query).subscribe(res => {
			this.filteredClients.next(res.data.slice());
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	getPaymentMethodsFilter(query = null){
		this.api.solicitudesServicioService.filtros('formas_pago?query='+query).subscribe(res => {
			this.filteredFormasPagos.next(res.data.slice());
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	getOriginsFilter(query = null){
		this.api.solicitudesServicioService.filtros('origenes?query='+query).subscribe(res => {
			this.filteredOrigenes.next(res.data.slice());
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	getDomiciliosCliente(clienteId = null, clienteDomicilioId = null){
		this.changeStatusInputs(false, 'cliente_domicilio_id')
		let id = clienteId? clienteId : this.generalForm.value.cliente_id;
		this.api.solicitudesServicioService.clientesDomicilios(id).subscribe((res: GeneralResponseModel) =>{
			this.domiciliosCliente = res.data;

			if(this.generalForm.get('cliente_id').enabled)
				this.changeStatusInputs(true, 'cliente_domicilio_id')

			if(clienteDomicilioId){
				const toSelect = this.domiciliosCliente.find((item) => item.id == clienteDomicilioId);
				this.generalForm.get('cliente_domicilio_id').setValue(toSelect)
			}
			this.isLoading = false;
			this.ref.detectChanges();
		});
	};

	getFiltros(){
		this.api.solicitudesServicioService.filtrosServicios('filtros_servicios').subscribe((res: FiltrosServiciosResponseModel) => {
			this.filteredOrigenes.next(res.origenes.slice());
			this.filteredFormasPagos.next(res.formas_pagos.slice());
			this.filteredServices.next(res.servicios.slice());
			this.tipoServicios = res.tipo_servicio;
			this.estatusServicios = res.estatus_servicios;
			this.initArraySelects(res.vehiculos, res.operadores, res.auxiliares);
			this.ref.detectChanges();
			this.getServicio();
		})
	};

	initArraySelects(vehiculos, operadores, auxiliares){

		this.vehiculos = vehiculos;
		this.asesores = operadores;
		this.auxiliares = auxiliares;

		for (let i = 0; i < 3; i++){
			this.filteredVehiculos.push(new ReplaySubject<any[]>(1));
			this.filteredVehiculos[i].next(vehiculos.slice());

			this.filteredAsesores.push(new ReplaySubject<any[]>(1));
			this.filteredAsesores[i].next(operadores.slice());

			this.filteredAuxiliares1.push(new ReplaySubject<any[]>(1));
			this.filteredAuxiliares1[i].next(auxiliares.slice());

			this.filteredAuxiliares2.push(new ReplaySubject<any[]>(1));
			this.filteredAuxiliares2[i].next(auxiliares.slice());
		}
	}

	/*setDefaultValues(){
		const toSelect = this.origenes.find((item) => item.id == 1);
		this.generalForm.get('origen_id').setValue(toSelect)
	}*/

	getVehicleFilter(query = null, index){
		this.api.solicitudesServicioService.filtros('vehiculos?query='+query).subscribe(res => {
			this.isLoadingInputSearch = false;
			this.validarDisponibilidad(index, true, false, false, res.data);
			this.ref.detectChanges();
		});
	}

	getServiceFilter(query = null){
		this.api.solicitudesServicioService.filtros('cat_servicios?query='+query).subscribe(res => {
			this.filteredServices.next(res.data.slice());
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	getConsultantFilter(query = null, index){
		this.api.solicitudesServicioService.filtros('operadores?query='+query).subscribe(res => {
			this.validarDisponibilidad(index, false, true, false, res.data);
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	getAuxiliarFilter(query = null, index, formControl){
		this.api.solicitudesServicioService.filtros('auxiliares?query='+query).subscribe(res => {
			this.validarDisponibilidad(index, false, false, true, res.data, formControl);
			this.isLoadingInputSearch = false;
			this.ref.detectChanges();
		});
	}

	validarDisponibilidad(index, vehiculo = true, asesor = true, auxiliar = true, dataFiltered = [], formControl = null, vehiculoAsesorAuxdetail: any = false, puedeEditar = true){

		let fechaSolicitud = this.getArrayItemFormControlName('fecha_solicitud', index);
		let horaSolicitud = this.getArrayItemFormControlName('hora_solicitud', index);
		let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index);
		let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index);

		if(vehiculo && asesor && auxiliar)
			this.clearSelectVAA(index);

		if(fechaSolicitud.value != '' && horaSolicitud.value != '' && (horasDuracion.value != '' || minutosDuracion.value != '')){
			this.isLoadingDisponibilidad[index] = true;

			if(vehiculo)
				this.newVehiculos = [];

			if(asesor)
				this.newAsesores = [];

			if(auxiliar)
				this.newAuxiliares = [];

			let data = {
				'solicitud_servicio_id': (this.servicioID) ? this.servicioID : '',
				'servicio_det_id': (this.servicioID) ? this.servicioID : '',
				'fecha_solicitud': this.formatDate(fechaSolicitud.value) + ' ' + horaSolicitud.value,
				'horas_duracion': horasDuracion.value != ''? horasDuracion.value.padStart(2, 0) : '00',
				'minutos_duracion': minutosDuracion.value != ''? minutosDuracion.value.padStart(2, 0) : '00'
			};

			fechaSolicitud.disable();
			horaSolicitud.disable();
			horasDuracion.disable();
			minutosDuracion.disable();
			let isDataFiltered = dataFiltered.length != 0;

			this.api.solicitudesServicioService.validarDisponibilidad(data).subscribe(disponibilidad => {

				if(vehiculo){
					let vehicle = (isDataFiltered)? dataFiltered : this.vehiculos;
					vehicle.forEach(vehiculo => {
						this.newVehiculos.push({
							'id': vehiculo.id,
							'descripcion': vehiculo.descripcion,
							'num_economico': vehiculo.num_economico,
							'tipo_vehiculo_id': vehiculo.tipo_vehiculo_id,
							'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.vehiculo_id == vehiculo.id) != null)
						});
					});

					this.filteredVehiculos[index].next(this.newVehiculos.slice());
					if(puedeEditar)
						this.getArrayItemFormControlName('vehiculo_id',index).enable();
				}

				if(asesor){
					let asesor = (isDataFiltered)? dataFiltered : this.asesores;
					asesor.forEach(asesor => {
						this.newAsesores.push({
							'id': asesor.id,
							'nombre': asesor.nombre,
							'apellido_paterno': asesor.apellido_paterno,
							'apellido_materno': asesor.apellido_materno,
							'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.operador_id == asesor.id) != null)
						});
					});

					this.filteredAsesores[index].next(this.newAsesores.slice());
					if(puedeEditar)
						this.getArrayItemFormControlName('operador_id',index).enable();
				}

				if(auxiliar){

					let auxiliares = [];

					if(formControl == 'auxiliar_1'){
						auxiliares = (isDataFiltered)? dataFiltered : this.auxiliares1;
					}else if(formControl == 'auxiliar_2'){
						auxiliares = (isDataFiltered)? dataFiltered : this.auxiliares2;
					}

					auxiliares.forEach(auxiliar => {
						this.newAuxiliares.push({
							'id': auxiliar.id,
							'nombre': auxiliar.nombre,
							'apellido_paterno': auxiliar.apellido_paterno,
							'apellido_materno': auxiliar.apellido_materno,
							'isDisable': (disponibilidad.find(disponibilidad => disponibilidad.auxiliar_1 == auxiliar.id || disponibilidad.auxiliar_2 == auxiliar.id) != null)
						});
					});

					if(formControl == 'auxiliar_1'){
						this.filteredAuxiliares1[index].next(this.newAuxiliares.slice());
					}else if(formControl == 'auxiliar_2'){
						this.filteredAuxiliares2[index].next(this.newAuxiliares.slice());
					}
				}

				if(vehiculoAsesorAuxdetail){
					this.getArrayItemFormControlName('vehiculo_id', index).setValue(vehiculoAsesorAuxdetail.vehiculo_id);
					this.getArrayItemFormControlName('operador_id', index).setValue(vehiculoAsesorAuxdetail.operador_id);

					if(vehiculoAsesorAuxdetail.auxiliar_1){
						let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index);
						auxiliar1.setValue(vehiculoAsesorAuxdetail.auxiliar_1);
						if(puedeEditar)
							auxiliar1.enable();
					}

					if(vehiculoAsesorAuxdetail.auxiliar_2){
						let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index);
						auxiliar2.setValue(vehiculoAsesorAuxdetail.auxiliar_2);
						if(puedeEditar)
							auxiliar2.enable();
					}

					this.generalForm.updateValueAndValidity();
				}

				this.isLoadingDisponibilidad[index] = false;
				if(puedeEditar){
					fechaSolicitud.enable();
					horaSolicitud.enable();
					horasDuracion.enable();
					minutosDuracion.enable();
				}
			});
		}
	}

	getAuxiliares(formControl, index) {
		return (formControl == 'auxiliar_1')? this.filteredAuxiliares1[index] : this.filteredAuxiliares2[index];
	}

	addAuxiliar(index){
		let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index);
		let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index);

		if(!auxiliar1.enabled){
			auxiliar1.enable();
			this.setFormControlValidators('auxiliar_1', index, [Validators.required]);
			return;
		}
		if(!auxiliar2.enabled){
			auxiliar2.enable();
			this.setFormControlValidators('auxiliar_2', index, [Validators.required]);
			return;
		}
	}

	deleteAuxiliar(formControl, index){
		let auxiliar = this.getArrayItemFormControlName(formControl, index);

		if(!this.isNew && auxiliar.value){
			let title = 'Eliminar auxiliar de operaciones';
			let description = "¿Está seguro de eliminar el auxiliar de operaciones? La información sera eliminada del servicio.";
			let waitDesciption = 'Eliminando auxiliar de operaciones...';
			let deleteMessage = `El auxiliar de operaciones ha sido eliminado con éxito`;
			let errorMessage = `El auxiliar de operaciones no se ha podido eliminar`;
			let btnText = 'Eliminar';

			let dialogRef = this.layoutUtilsService.deleteElement(
				title, description, waitDesciption, btnText
			);
			dialogRef.afterClosed().subscribe(res => {
				if (!res) {
					return;
				}

				let id = this.getArrayItemFormControlName('id', index).value;

				this.api.solicitudesServicioService.deleteAuxiliar(id, auxiliar.value).subscribe(() => {
					this.layoutUtilsService.showActionNotification(deleteMessage, MessageType.Delete);
					this.deleteAuxiliarLocal(auxiliar, formControl, index);
				}, () => {
					this.layoutUtilsService.showActionNotification(errorMessage, MessageType.Delete);
				});
			});
		}else{
			this.deleteAuxiliarLocal(auxiliar, formControl, index);
		}
	}

	deleteAuxiliarLocal(auxiliar, formControl, index){
		auxiliar.disable();
		auxiliar.setValue(null);
		this.setFormControlValidators(formControl, index, []);
	}

	isDisableAuxiliarButton(index){
		let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1', index).enabled;
		let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2', index).enabled;
		let vehiculo = this.getArrayItemFormControlName('vehiculo_id',index).disabled;
		let operador = this.getArrayItemFormControlName('operador_id',index).disabled;

		return vehiculo && operador || auxiliar1 && auxiliar2;
	}

	isDisableAuxiliar(formControlName, index){
		return this.getArrayItemFormControlName(formControlName, index).enabled;
	}

	clearSelectVAA(index){
		let vehiculo = this.getArrayItemFormControlName('vehiculo_id',index);
		let operador = this.getArrayItemFormControlName('operador_id',index);
		let auxiliar1 = this.getArrayItemFormControlName('auxiliar_1',index);
		let auxiliar2 = this.getArrayItemFormControlName('auxiliar_2',index);

		vehiculo.setValue(null)
		operador.setValue(null);
		auxiliar1.setValue(null);
		auxiliar2.setValue(null);
		vehiculo.disable();
		operador.disable();
		auxiliar1.disable();
		auxiliar2.disable();
	}

	validateDuracion(index){
		let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index).value;
		let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index).value;

		if(horasDuracion == '' && minutosDuracion == ''){
			this.setFormControlValidators('horas_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]);
			this.setFormControlValidators('minutos_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]);
		}

		if(horasDuracion != ''){
			this.setFormControlValidators('horas_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]);
			this.setFormControlValidators('minutos_duracion', index, [Validators.pattern(/^[0-9]\d*$/)]);
		}

		if(minutosDuracion != ''){
			this.setFormControlValidators('horas_duracion', index, [Validators.pattern(/^[0-9]\d*$/)]);
			this.setFormControlValidators('minutos_duracion', index, [Validators.required, Validators.pattern(/^[0-9]\d*$/)]);
		}

		this.clearSelectVAA(index);
	}

	setFormControlValidators(controlNameUpdate, index, validators){
		let formControl = this.getArrayItemFormControlName(controlNameUpdate, index);
		formControl.clearValidators();
		formControl.setValidators(validators);
		formControl.updateValueAndValidity();
	}

	enableSearchBtn(index){
		let fechaSolicitud = this.getArrayItemFormControlName('fecha_solicitud', index).value;
		let horaSolicitud = this.getArrayItemFormControlName('hora_solicitud', index).value;
		let horasDuracion = this.getArrayItemFormControlName('horas_duracion', index).value;
		let minutosDuracion = this.getArrayItemFormControlName('minutos_duracion', index).value;

		if(!(fechaSolicitud != '' && horaSolicitud != '' && (horasDuracion != '' || minutosDuracion != ''))){
			this.getArrayItemFormControlName('vehiculo_id', index).disable();
			this.getArrayItemFormControlName('operador_id', index).disable();
			this.getArrayItemFormControlName('auxiliar_1', index).disable();
			this.getArrayItemFormControlName('auxiliar_2', index).disable();
			return true;
		}

		return false;
	}

	changeStatusInputs(enable, formControl){
		if(enable){
			this.generalForm.controls[formControl].enable();
		}else{
			this.generalForm.controls[formControl].disable();
		}
	}

	onKeyDown(tipo, index = null) {
		this.isLoadingInputSearch = false;

		switch (tipo){
			case 'client': { this.filteredClients.next([]); break; }
			case 'service': { this.filteredServices.next([]); break; }
			case 'paymentMethod': { this.filteredFormasPagos.next([]); break; }
			case 'origins': { this.filteredOrigenes.next([]); break; }
			case 'vehicle': {
				if(!this.recently)
					this.filteredVehiculos[index].next([]);
				break;
			}
			case 'consultant': {
				if(!this.recently)
					this.filteredAsesores[index].next([]);
				break;
			}
			case 'auxiliar_1': {
				if(!this.recently)
					this.filteredAuxiliares1[index].next([]);
				break;
			}
			case 'auxiliar_2': {
				if(!this.recently)
					this.filteredAuxiliares2[index].next([]);
				break;
			}
		}

		clearTimeout(this.typingTimer);
	}

	isControlValid(controlName: string): boolean {
		let control = this.generalForm.controls[controlName];
		if (!control) {
			return false;
		} else if (control.valid) {
			return false;
		}
		return true;
	}

	isControlHasErrorArray(controlName: string, validationType: string, i): boolean {
		let cont = this.getArrayItemFormControlName(controlName, i)
		return cont.hasError(validationType) && (cont.dirty || cont.touched);
	}

	clearSelect(text){
		if(text == ''){
			this.filteredClients.next([]);
			this.isLoadingInputSearch = false;
		}
	}

	generateHours() {
		let date, array = [];
		date = new Date(2023,1,1,0,0);

		while (date.getMinutes() % 15 !== 0) {
			date.setMinutes ( date.getMinutes() + 1 );
		}
		for (var i = 0; i < 24 * 4; i++) {
			array.push(date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2,'0'));
			date.setMinutes ( date.getMinutes() + 15);
		}

		return array;
	}

	numberOnly(event): boolean {
		const charCode = (event.which) ? event.which : event.keyCode;
		if (charCode > 31 && (charCode < 48 || charCode > 57)) {
			return false;
		}
		return true;
	}

	formatCurrency(input, index, blur = null) {

		let inputVal = (typeof input === 'string')? input : input.target.value;

		if (inputVal === "") { return; }

		if (inputVal.indexOf(".") >= 0) {
			var decimalPos = inputVal.indexOf(".");

			var leftSide = inputVal.substring(0, decimalPos);
			var rightSide = inputVal.substring(decimalPos);

			leftSide = this.formatNumber(leftSide);
			rightSide = this.formatNumber(rightSide);

			if (blur === "blur") {
				rightSide += "00";
			}

			rightSide = rightSide.substring(0, 2);
			inputVal = leftSide + "." + rightSide;

		} else {
			inputVal = this.formatNumber(inputVal);
			if (blur === "blur") {
				inputVal += ".00";
			}
		}

		this.getArrayItemFormControlName('costo_servicio', index).setValue(inputVal);
	}

	limitCurrency(index){
		let value = this.getArrayItemFormControlName('costo_servicio', index).value;
		return value? value.replaceAll(',', '') < 999999 : true;
	}

	formatNumber(n) {
		return n.replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",")
	}

	getArrayItemFormControlName(formControlName, index){
		let controls = this.generalForm.get('servicios') as FormArray;
		let control = controls.controls[index] as FormArray;
		return control.controls[formControlName];
	}

	formatDate(date){
		return moment(date).format('YYYY-MM-DD');
	}

	onSubmit(){

		let generalControls = this.generalForm.controls;
		let generalControlsRequest = this.generalForm.getRawValue();

		if (this.generalForm.invalid) {
			Object.keys(generalControls).forEach(generalControlName => {
				generalControls[generalControlName].markAsTouched();
				if(generalControlName == 'servicios'){
					// @ts-ignore
					generalControls.servicios.controls.forEach(sC => {
						Object.keys(sC.controls).forEach(servicioControlName => {
							sC.controls[servicioControlName].markAsTouched();
						})
					})
				}
			})
			return;
		}

		let servicios = [];

		generalControlsRequest.servicios.forEach(servicio => {
			let horaDuracion = servicio.horas_duracion != ''? servicio.horas_duracion.padStart(2, 0) : '00';
			let minutoDuracion = servicio.minutos_duracion != ''? servicio.minutos_duracion.padStart(2, 0) : '00';

			let ser: any = {
				id: servicio.id,
				servicio_id: servicio.servicio_id,
				tipo_servicio_id: servicio.tipo_servicio_id,
				estatus_servicio_id: servicio.estatus_servicio_id,
				definido_cliente: servicio.definido_cliente,
				requiere_encuesta: servicio.requiere_encuesta,
				vehiculo_id: servicio.vehiculo_id,
				operador_id: servicio.operador_id,
				costo_servicio: servicio.costo_servicio.replaceAll(',', ''),
				observacion_atencion_cliente: servicio.observacion_atencion_cliente,
				facturado: servicio.facturado,
				duracion: horaDuracion + ':' + minutoDuracion + ':00',
				fecha_solicitud: this.formatDate(servicio.fecha_solicitud) + ' ' + servicio.hora_solicitud + ':00',
			}

			if(!servicio.auxiliar_1 && servicio.auxiliar_2){
				servicio.auxiliar_1 = servicio.auxiliar_2;
				servicio.auxiliar_2 = null;
			}

			if(servicio.auxiliar_1)
				ser.auxiliar_1 = servicio.auxiliar_1;

			if(servicio.auxiliar_2)
				ser.auxiliar_2 = servicio.auxiliar_2;

			servicios.push(ser);
		})

		let data = {
			cliente_id: generalControlsRequest.cliente_id,
			cliente_domicilio_id: generalControlsRequest.cliente_domicilio_id.id,
			forma_pago_id: generalControlsRequest.forma_pago_id,
			origen_id: generalControlsRequest.origen_id,
			servicios: servicios
		};

		this.isLoading = true;
		this.disableEnableAll(true);

		if(!this.isNew){
			this.api.solicitudesServicioService.update(this.servicioID, data).subscribe(res => {
				this.isLoading = false;
				this.router.navigate(['../../'], {relativeTo: this.activatedRoute})
			}, _ => {
				this.isLoading = false;
				this.disableEnableAll(false);
				this.ref.detectChanges();
			});
		}else{
			this.api.solicitudesServicioService.create(data).subscribe(_ => {
				this.isLoading = false;
				this.router.navigate(['../'], {relativeTo: this.activatedRoute})
			}, _ => {
				this.isLoading = false;
				this.ref.detectChanges();
			});
		}
	}

	disableEnableAll(disable = false){
		if(!this.isNew){
			let generalControls2 = this.generalForm.controls;
			this.disableAll = disable;

			Object.keys(generalControls2).forEach(generalControlName => {
				if(disable){
					generalControls2[generalControlName].disable();
				}else{
					generalControls2[generalControlName].enable();
				}

				if(generalControlName == 'servicios'){
					// @ts-ignore
					generalControls2.servicios.controls.forEach(sC => {
						Object.keys(sC.controls).forEach(servicioControlName => {
							let control = sC.controls[servicioControlName];
							if(servicioControlName == 'auxiliar_1' || servicioControlName == 'auxiliar_2'){
								if(!control.value) {
									control.disable();
								}else{
									control.enable();
								}
							}else{
								if(disable) {
									control.disable();
								}else{
									control.enable();
								}
							}
						})
					})
				}
			})

			this.generalForm.updateValueAndValidity();
		}
	}
}
