import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { PageEvent } from '@angular/material/paginator';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { VuelosService } from '../../services/vuelos.service';
import { EscalasService } from '../../services/escalas.service';
import { AeropuertosService } from '../../../aeropuertos/services/aeropuertos.service';
import { Router, ActivatedRoute } from '@angular/router';
import Swal from 'sweetalert2';

@Component({
  selector: 'app-agregar',
  templateUrl: './agregar.component.html',
  styleUrls: ['./agregar.component.css']
})
export class AgregarComponent implements OnInit {

  @ViewChild('diaSalidaEscala') dateEscalaSalida!: ElementRef;
  @ViewChild('diaLlegadaEscala') dateEscalaLlegada!: ElementRef;
  @ViewChild('diaSalidaVuelo') dateVueloSalida!: ElementRef;
  @ViewChild('diaLlegadaVuelo') dateVueloLlegada!: ElementRef;

  id: number = 0;
  tipoBoton: string = 'Agregar';
  aeropuertos: any[] = [];
  escalasPost: any[] = [];
  escalasShow: any[] = [];
  escalasBorradas: number[] = [];

  vueloForm: FormGroup = this.formBuilder.group({
    diaSalida: [ '' , [ Validators.required] ],
    diaLlegada: [ '' , [ Validators.required] ],
    origen: [ '' , [ Validators.required] ],
    destino: [ '' , [ Validators.required] ],
    codigoAerolinea: [ '' , [ Validators.required] ],
    codigoTipoAeronave: [ '' , [ Validators.required] ],
    costo:[ '' , [ Validators.required] ],
  })

  escalaForm: FormGroup = this.formBuilder.group({
    diaSalida: [ '' , [ Validators.required] ],
    diaLlegada: [ '' , [ Validators.required] ],
    origen: [ '' , [ Validators.required] ],
    destino: [ '' , [ Validators.required] ]
  })

  constructor(
    private formBuilder: FormBuilder,
    private vuelosService: VuelosService,
    private escalaService: EscalasService,
    private aeropuertosService: AeropuertosService,
    private activateRoute: ActivatedRoute,
    private router: Router
  ){}

  ngOnInit(): void {
    setTimeout(() => {
      this.dateEscalaSalida!.nativeElement.value = new Date().toISOString().slice(0, 16);
      this.dateEscalaLlegada!.nativeElement.value = new Date().toISOString().slice(0, 16);
    }, 500);
    if(this.router.url.includes('editar') ) {
      this.id = this.activateRoute.snapshot.params['id'];
      this.tipoBoton="Actualizar"
      this.llenarFormulario();
    }else{
      setTimeout(() => {
        this.dateVueloSalida!.nativeElement.value = new Date().toISOString().slice(0, 16);
        this.dateVueloLlegada!.nativeElement.value = new Date().toISOString().slice(0, 16);
      }, 500);
    }
    this.listarAeropuertos();
  }

  listarAeropuertos(){
    this.aeropuertosService.getAeropuertos().subscribe(
      res => {
        this.aeropuertos = res;
      }
    )
  }

  guardar(){
    if ( this.vueloForm.invalid)  {
      this.vueloForm.markAllAsTouched();
      return;
    }
    if (this.id==0) {
      if (this.escalasPost.length == 0) {
        const Toast = Swal.mixin({
          toast: true,
          position: 'top-end',
          showConfirmButton: false,
          timer: 2000,
          timerProgressBar: true,
          didOpen: (toast) => {
            toast.addEventListener('mouseenter', Swal.stopTimer)
            toast.addEventListener('mouseleave', Swal.resumeTimer)
          }
        })
        Toast.fire({
          icon: 'error',
          title: 'Agrega al menos una escala'
        })
        return;
      }
    } else {
      if (this.escalasShow.length == 0) {
        const Toast = Swal.mixin({
          toast: true,
          position: 'top-end',
          showConfirmButton: false,
          timer: 2000,
          timerProgressBar: true,
          didOpen: (toast) => {
            toast.addEventListener('mouseenter', Swal.stopTimer)
            toast.addEventListener('mouseleave', Swal.resumeTimer)
          }
        })
        Toast.fire({
          icon: 'error',
          title: 'Agrega al menos una escala'
        })
        return;
      }
    }
    if(!this.id) {
      this.agregarVuelo();
    }else{
      this.actualizarVuelo();
    }
  }

  prueba(){
    let datos = this.escalaForm.value;

    let query = {
      fechaSalida: datos.diaSalida,
      fechaLlegada: datos.diaLlegada,
      codigoAeropuertoOrigen: {
        id: datos.origen.id
      },
      codigoAeropuertoDestino: {
        id: datos.destino.id
      },
      codigoVuelo: {
        id: 0
      }
    }

    let showEscala = {
      fechaSalida: datos.diaSalida,
      fechaLlegada: datos.diaLlegada,
      aeropuertoOrigen:  datos.origen.codigo,
      aeropuertoDestino: datos.destino.codigo
    }
    this.escalasPost.push(query); 
    this.escalasShow.push(showEscala);
  }

  agregarEscalasAlVuelo(idVuelo: number){
    for(let i = 0; i < this.escalasPost.length; i++){
      this.escalasPost[i].codigoVuelo.id = idVuelo;
      this.escalaService.addEscala(this.escalasPost[i]).subscribe(
        res =>{
        }
      ) 
    }
  }

  agregarVuelo(){
    let datos = this.vueloForm.value;
    let query = {
      costo: datos.costo,
      fechaSalida: datos.diaSalida,
      fechaLlegada: datos.diaLlegada,
      codigoAerolinea: datos.codigoAerolinea,
      codigoTipoAeronave: datos.codigoTipoAeronave,
      codigoAeropuertoOrigen: {
        id: datos.origen
      },
      codigoAeropuertoDestino: {
        id: datos.destino
      }
    }
    this.vuelosService.addVuelo(query).subscribe(
      res =>{
        this.agregarEscalasAlVuelo(res['id']);
      }
    )
    this.irAlListado();
  }

  private llenarFormulario(){
    this.vuelosService.getVuelo(this.id).subscribe(
      res => {
        let date= new Date(res['fechaLlegada']).toISOString().slice(0, 16);
        let date2= new Date(res['fechaSalida']).toISOString().slice(0, 16);
        this.vueloForm.controls['diaLlegada'].setValue(date);
        this.vueloForm.controls['diaSalida'].setValue(date2);
        this.vueloForm.controls['codigoAerolinea'].setValue(res.codigoAerolinea);
        this.vueloForm.controls['codigoTipoAeronave'].setValue(res.codigoTipoAeronave);
        this.vueloForm.controls['costo'].setValue(res.costo);
        this.vueloForm.controls['origen'].setValue(res.codigoOrigen);
        this.vueloForm.controls['destino'].setValue(res.codigoDestino);
        this.escalasShow = res.escalas;
      }
    )
  }

  borarFilaEscala(id: number, idEscalaBD: number){
    this.escalasShow.splice(id, 1);
    if (!idEscalaBD) {
      this.escalasPost.splice(id, 1);
    }    
    if (this.id) {
      this.escalasBorradas.push(idEscalaBD);
    }
  }

  actualizarVuelo(){
    let datos = this.vueloForm.value;

    let query = {
      costo: datos.costo,
      fechaSalida: datos.diaSalida,
      fechaLlegada: datos.diaLlegada,
      codigoAerolinea: datos.codigoAerolinea,
      codigoTipoAeronave: datos.codigoTipoAeronave,
      codigoAeropuertoOrigen: {
        id: datos.origen
      },
      codigoAeropuertoDestino: {
        id: datos.destino
      }
    }

    this.vuelosService.updateVuelo(this.id, query).subscribe(
      res => {
        this.agregarEscalasAlVuelo(this.id);
        if(this.escalasBorradas.length !=0){
          this.eliminarEscalasBD();
        }
      }
    )
    this.irAlListado();
  }

  eliminarEscalasBD(){
    for(let i = 0; i < this.escalasBorradas.length; i++){
      this.escalaService.deleteEscala(this.escalasBorradas[i]).subscribe(
        res =>{
        }
      ) 
    }
  }

  private irAlListado(){
    this.router.navigate(['/vuelos/listado']);
  }

}


