import {ChangeDetectorRef, Component, OnInit} from '@angular/core';
import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms';
import {ActivatedRoute, Router} from '@angular/router';
import {LayoutUtilsService, MessageType} from '../../../../../core/_base/crud';
import {ApiService} from '../../../../../core/api/api.service';
import {Clientes} from '../clientes.model';
import {ReplaySubject, Subscription} from 'rxjs';
import Utils from "../../../../../utils";

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

	//SearchRols
	typingTimer;
	typingInterval = 700;
	lastLengthRol = 0;
	hidePassword = true;

	req_factura = false;

	clientesForm: FormGroup;
	datosFiscalesForm: FormGroup;
	selectedTab = 0;
	subscriptions: Subscription[] = [];
	isNewCliente = false;
	isLoading = true;
	loading = false;
	clienteID = 0;
	recently = true;

	filteredSucursales: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	sucursales = [];

	filteredAsesores: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	asesores = [];

	filteredMetodoPago: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	metodo_pago = [];

	filteredFormaPago: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	forma_pago = [];

	filteredTipoComprobante: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	tipo_comprobante = [];

	filteredUsoCFDI: ReplaySubject<any[]> = new ReplaySubject<any[]>(1);
	uso_cfdi = [];

	//input search filter
	isLoadingInputSearch = true;

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

	ngOnInit() {
		this.crearFormulario();
		this.getSucursales();
		this.getAsesores();
		this.getFormaPago();
		this.getMetodoPago();
		this.getTipoComprobante();
		this.getUsoCFDI();
	}

	getCliente() {
		let routeSubscription = this.activatedRoute.params.subscribe(params => {
			this.clienteID = params.id;
			if (this.clienteID && this.clienteID > 0) {
				this.isNewCliente = false;
				this.api.clientes.show(this.clienteID).subscribe(res => {
					this.isLoading = false;

					res.requiere_factura = Utils.toNumber(res.requiere_factura);
					this.req_factura = res.requiere_factura == 1;
					res.asesor_id = Utils.toNumber(res.asesor_id);
					res.sucursal_id = Utils.toNumber(res.sucursal_id);

					this.clientesForm.reset(res);

					if(this.req_factura){
						res.datos_fiscales.retencion_iva = Utils.toNumber(res.datos_fiscales.retencion_iva);
						res.datos_fiscales.factura_formas_pago_id = Utils.toNumber(res.datos_fiscales.factura_formas_pago_id);
						res.datos_fiscales.factura_metodos_pago_id = Utils.toNumber(res.datos_fiscales.factura_metodos_pago_id);
						res.datos_fiscales.factura_tipo_comprobante_id = Utils.toNumber(res.datos_fiscales.factura_tipo_comprobante_id);
						res.datos_fiscales.factura_uso_cfdi_id = Utils.toNumber(res.datos_fiscales.factura_uso_cfdi_id);
						this.datosFiscalesForm.reset(res.datos_fiscales)
					}

					this.ref.detectChanges();
				});
			} else {
				this.isNewCliente = true;
				this.isLoading = true;
				this.ref.detectChanges();
			}
		});
		this.subscriptions.push(routeSubscription);
	}

	getSucursales() {
		this.api.clientes.sucursales('administrador/clientes/sucursales').subscribe(res => {
			this.sucursales = res.data;
			this.filteredSucursales.next(res.data.slice());
			this.ref.detectChanges();
		});
	}

	getAsesores() {
		this.api.clientes.asesores('administrador/clientes/asesores').subscribe(res => {
			this.asesores = res.data;
			this.filteredAsesores.next(res.data.slice());
			this.ref.detectChanges();
			this.isLoading = false;
		});
	}

	getFormaPago() {
		this.api.clientes.formasPago('administrador/clientes/formas_pago').subscribe(res => {
			this.forma_pago = res.data;
			this.filteredFormaPago.next(res.data.slice());
			this.ref.detectChanges();
		});
	}

	getMetodoPago() {
		this.api.clientes.metodoPago('administrador/clientes/metodos_pago').subscribe(res => {
			this.metodo_pago = res.data;
			this.filteredMetodoPago.next(res.data.slice());
			this.ref.detectChanges();
		});
	}

	getTipoComprobante() {
		this.api.clientes.tipoComprobante('administrador/clientes/tipo_comprobante').subscribe(res => {
			this.tipo_comprobante = res.data;
			this.filteredTipoComprobante.next(res.data.slice());
			this.ref.detectChanges();
		});
	}

	getUsoCFDI() {
		this.api.clientes.usoCFDI('administrador/clientes/cfdi').subscribe(res => {
			this.uso_cfdi = res.data;
			this.filteredUsoCFDI.next(res.data.slice());
			this.ref.detectChanges();
		});
	}

	onKeyUpManual(ev, tipo) {
		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 'asesor': {
						this.getAsesorFilter(text);
						break;
					}
					case 'sucursal': {
						this.getSucursalFilter(text);
						break;
					}
					case 'forma_pago': {
						this.getFormaPagoFilter(text);
						break;
					}
					case 'metodo_pago': {
						this.getMetodoPagoFilter(text);
						break;
					}
					case 'tipo_comprobante': {
						this.getTipoComprobanteFilter(text);
						break;
					}
					case 'uso_cfdi': {
						this.getUsoCFDIFilter(text);
						break;
					}
				}

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

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

	}

	onKeyDown(tipo) {
		this.isLoadingInputSearch = false;

		switch (tipo) {
			case 'asesor': {
				this.filteredAsesores.next([]);
				break;
			}
			case 'sucursal': {
				if (!this.recently)
					this.filteredSucursales.next([]);
				break;
			}
			case 'forma_pago': {
				if (!this.recently)
					this.filteredFormaPago.next([]);
				break;
			}
			case 'metodo_pago': {
				if (!this.recently)
					this.filteredMetodoPago.next([]);
				break;
			}
			case 'tipo_comprobante': {
				if (!this.recently)
					this.filteredTipoComprobante.next([]);
				break;
			}
			case 'uso_cfdi': {
				if (!this.recently)
					this.filteredUsoCFDI.next([]);
				break;
			}
		}

		clearTimeout(this.typingTimer);
	}

	getAsesorFilter(query = null) {
		this.clientesForm.controls['searchAsesor'].setValue(query);
		if (query != '') {
			this.api.clientes.asesores('administrador/clientes/asesores?query=' + query).subscribe(res => {
				this.filteredAsesores.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	getSucursalFilter(query = null) {
		this.clientesForm.controls['searchSucursal'].setValue(query);
		if (query != '') {
			this.api.clientes.sucursales('administrador/clientes/sucursales?query=' + query).subscribe(res => {
				this.filteredSucursales.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	getFormaPagoFilter(query = null) {
		this.datosFiscalesForm.controls['searchFormaPago'].setValue(query);
		if (query != '') {
			this.api.clientes.formasPago('administrador/clientes/formas_pago?query=' + query).subscribe(res => {
				this.filteredFormaPago.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	getMetodoPagoFilter(query = null) {
		this.datosFiscalesForm.controls['searchMetodoPago'].setValue(query);
		if (query != '') {
			this.api.clientes.metodoPago('administrador/clientes/metodos_pago?query=' + query).subscribe(res => {
				this.filteredMetodoPago.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	getTipoComprobanteFilter(query = null) {
		this.datosFiscalesForm.controls['searchTipoComprobante'].setValue(query);
		if (query != '') {
			this.api.clientes.tipoComprobante('administrador/clientes/tipo_comprobante?query=' + query).subscribe(res => {
				this.filteredTipoComprobante.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	getUsoCFDIFilter(query = null) {
		this.datosFiscalesForm.controls['searchUsoCFDI'].setValue(query);
		if (query != '') {
			this.api.clientes.usoCFDI('administrador/clientes/cfdi?query=' + query).subscribe(res => {
				this.filteredUsoCFDI.next(res.data.slice());
				this.isLoadingInputSearch = false;
				this.ref.detectChanges();
			});
		}
	}

	crearFormulario() {
		this.clientesForm = this.fb.group({
			denominacion: [null, [Validators.required, Validators.maxLength(128)],],
			email: ["", [Validators.email]],
			asesor_id: ['', [Validators.required]],
			sucursal_id: ['', [Validators.required]],
			requiere_factura: ['', [Validators.required]],
			searchAsesor: [''],
			searchSucursal: [''],
		});

		this.datosFiscalesForm = this.fb.group({
			razon_social: ["", []],
			rfc: ["", []],
			calle: ["", []],
			email: ["", [Validators.email]],
			num_ext: ["", []],
			num_int: ["", []],
			colonia: ["", []],
			cp: ["", []],
			localidad: ["", []],
			municipio: ["", []],
			estado: ["", []],
			pais: ["", []],
			retencion_iva: [0, []],
			condicion_pago: ["", [Validators.maxLength(128)]],
			observacion: ["", [Validators.maxLength(128)]],
			factura_metodos_pago_id: ["", []],
			factura_formas_pago_id: ["", []],
			factura_tipo_comprobante_id: ["", []],
			factura_uso_cfdi_id: ["", []],
			searchFormaPago: [''],
			searchMetodoPago: [''],
			searchTipoComprobante: [''],
			searchUsoCFDI: [''],
		});
	}

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

	onSubmit() {
		let controls = this.clientesForm.controls;
		if (this.clientesForm.invalid) {
			Object.keys(controls).forEach(controlName => {
				controls[controlName].markAsTouched();
			})
			return;
		}

		let clientes: Clientes = this.clientesForm.value as Clientes;

		if (clientes.requiere_factura)
			clientes['datos_fiscales'] = this.datosFiscalesForm.value;

		if (this.isNewCliente) {
			this.addCliente(clientes);
		} else
			this.updateCliente(this.clienteID, clientes);
	}

	addCliente(cliente) {
		this.api.clientes.create(cliente).subscribe(() => {
			this.loading = false;
			this.layoutUtilsService.showActionNotification('Cliente guardado con éxito.', MessageType.Create);
			this.router.navigate(['../'], {relativeTo: this.activatedRoute})
		}, () => {
			this.loading = false;
		});
	}

	updateCliente(id, cliente) {
		this.api.clientes.update(id, cliente).subscribe(() => {
			this.loading = false;
			this.layoutUtilsService.showActionNotification('Cliente actualizado con éxito.', MessageType.Update);
			this.router.navigate(['../../'], {relativeTo: this.activatedRoute})
		}, () => {
			this.loading = false;
		});
	}

	selectionChange(event) {
		event.value == 1 ? this.req_factura = true : this.req_factura = false
	}

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

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

	ngAfterViewInit(): void {
		this.getCliente();
	}
}
