import { Component, OnInit, Input } from "@angular/core";
import { InstrumentComponent } from "@app/components/investment-proposals/instrument/instrument.component";
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
import { IAngularMyDpOptions, IMyDateModel } from "angular-mydatepicker";
import { formatDate, DatePipe } from "@angular/common";
import { Router } from "@angular/router";
import { FormInvestmentProposalService } from "@app/services/form-investment-proposal.service";
import { CatalogsService } from "@app/services/catalogs.service";
import { InstrumentCalculations } from "@app/services/instrument-calculations.service";
import Swal from "sweetalert2";
import { GeneralInfo } from "@app/models/investment-proposal-form";
import { parse } from "date-fns";

@Component({
  selector: "app-pbur",
  templateUrl: "./pbur.component.html"
})
export class PBUR implements InstrumentComponent {
  title: string = "Papel bursátil";
  @Input() data: any;
  @Input() summary: boolean;
  @Input() investmentID: string;

  form: any;
  general: GeneralInfo;

  // For daterange
  daysLabels: any = {
    su: "Dom",
    mo: "Lun",
    tu: "Mar",
    we: "Mie",
    th: "Jue",
    fr: "Vie",
    sa: "Sab"
  };
  monthsLabels: any = {
    1: "Ene",
    2: "Feb",
    3: "Mar",
    4: "Abr",
    5: "May",
    6: "Jun",
    7: "Jul",
    8: "Ago",
    9: "Sep",
    10: "Oct",
    11: "Nov",
    12: "Dic"
  };
  instrument_exists: boolean;
  instrument_work: any = [];
  investmentProposalForm: FormGroup;
  myDpOptions: IAngularMyDpOptions = {
    dateRange: false,
    dateFormat: "dd/mm/yyyy",
    dayLabels: this.daysLabels,
    monthLabels: this.monthsLabels
  };
  submitted: boolean;
  myDateInit: boolean = true;
  model: IMyDateModel = null;
  pburObject: {};
  format_incomes: any;
  ingreso_bruto: number = 0.0;
  ingreso_neto: number = 0.0;
  valor_transado: number = 0.0;
  precio_porcentaje: number = 0.0;
  rendimiento_neto: number = 0.0;
  total_pagar: number = 0.0;
  comision_bolsa: number = 0.0;
  comision_casa: number = 0.0;
  plazo: number = 0;
  interes_acumulado: number = 0;
  fecha_inicio_vigencia: string;
  instrumentSaved: boolean;

  constructor(
    private formBuilder: FormBuilder,
    private router: Router,
    private formDataService: FormInvestmentProposalService,
    private catalogService: CatalogsService,
    private instrumentCalcService: InstrumentCalculations,
    public datepipe: DatePipe
  ) {
    this.instrument_work = this.formDataService.getWork();
    this.instrument_exists = this.instrument_work == undefined;
    console.log(this.instrument_work);
    console.log("instrument exists");
    console.log(this.instrument_exists);
    this.general = this.formDataService.getGeneralInfo();

    //getIncomeFormat
    this.catalogService.getIncomeFormat().subscribe(res => {
      this.format_incomes = res;
    });

    this.investmentProposalForm = this.formBuilder.group({
      valor_nominal: [
        this.instrument_exists ? "" : this.instrument_work.valor_nominal,
        [
          Validators.required,
          Validators.pattern(/^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$/)
        ]
      ],
      otros_costos: [
        this.instrument_exists ? "" : this.instrument_work.otros_costos,
        [Validators.pattern(/^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$/)]
      ],
      renta_porcentaje: [
        this.instrument_exists ? "" : this.instrument_work.renta_porcentaje,
        [Validators.required]
      ],
      comision_casa_porcentaje: [
        this.instrument_exists
          ? ""
          : this.instrument_work.comision_casa_porcentaje,
        [
          Validators.required,
          Validators.pattern(/^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$/)
        ]
      ],
      comision_bolsa_porcentaje: [
        this.instrument_exists
          ? ""
          : this.instrument_work.comision_bolsa_porcentaje,
        [
          Validators.required,
          Validators.pattern(/^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$/)
        ]
      ],
      plazo: [
        this.instrument_exists ? "" : this.instrument_work.plazo,
        [Validators.required]
      ],
      rendimiento_bruto: [
        this.instrument_exists ? "" : this.instrument_work.rendimiento_bruto,
        [
          Validators.required,
          Validators.pattern(/^[+]?([0-9]+(?:[\.][0-9]*)?|\.[0-9]+)$/)
        ]
      ],
      /*formato_ingreso: [
        this.instrument_exists ? "" : this.instrument_work.formato_ingreso,
        [Validators.required]
      ],*/
      fecha_liquidacion: [
        this.instrument_exists
          ? ""
          : {
              isRange: false,
              singleDate: {
                jsDate: parse(
                  this.instrument_work.fecha_liquidacion,
                  "dd/MM/yyyy",
                  new Date()
                ),
                formatted: this.instrument_work.fecha_liquidacion
              }
            },
        Validators.required
      ],
      fecha_vencimiento: [
        this.instrument_exists
          ? ""
          : {
              isRange: false,
              singleDate: {
                jsDate: parse(
                  this.instrument_work.fecha_vencimiento,
                  "dd/MM/yyyy",
                  new Date()
                ),
                formatted: this.instrument_work.fecha_vencimiento
              }
            },
        Validators.required
      ],
      fecha_operacion: [
        this.instrument_exists
          ? ""
          : {
              isRange: false,
              singleDate: {
                jsDate: parse(
                  this.instrument_work.fecha_operacion,
                  "dd/MM/yyyy",
                  new Date()
                ),
                formatted: this.instrument_work.fecha_operacion
              }
            },
        Validators.required
      ],
      fecha_ultima_cupon: [
        this.instrument_exists
          ? ""
          : {
              isRange: false,
              singleDate: {
                jsDate: parse(
                  this.instrument_work.fecha_ultima_cupon,
                  "dd/MM/yyyy",
                  new Date()
                ),
                formatted: this.instrument_work.fecha_ultima_cupon
              }
            }
      ]
    });
  }

  get f() {
    return this.investmentProposalForm.controls;
  }

  save(form: any): boolean {
    if (!form.valid) {
      return false;
    }
    return true;
  }

  getCalculations(form: any, saveForm: boolean) {
    this.submitted = true;
    if (!form.valid) {
      return false;
    }
    Swal.fire({
      allowOutsideClick: false,
      icon: "info",
      text: "Espere por favor..."
    });
    Swal.showLoading();

    this.instrumentCalcService
      .vcnCalc(
        "PBUR", // Codigo del instrumento
        {
          id_tipo_base: this.general.base_anual,
          id_periodicidad: this.general.periodicidad,
          id_formato_ingreso: this.general.formato_ingreso
        },
        {
          valor_par: false,
          valor_nominal: +this.f.valor_nominal.value,
          comision_casa_porcentaje: this.f.comision_casa_porcentaje.value,
          comision_bolsa_porcentaje: this.f.comision_bolsa_porcentaje.value,
          rendimiento_bruto: this.f.rendimiento_bruto.value,
          otros_costos: this.f.otros_costos.value,
          plazo: this.f.plazo.value,
          renta_porcentaje: this.f.renta_porcentaje.value,
          //id_formato_ingreso: this.f.formato_ingreso.value,
          fecha_operacion: this.f.fecha_operacion.value.singleDate.formatted,
          fecha_liquidacion: this.f.fecha_liquidacion.value.singleDate
            .formatted,
          fecha_ultima_cupon: this.f.fecha_ultima_cupon.value.singleDate
            .formatted,
          fecha_vencimiento: this.f.fecha_vencimiento.value.singleDate.formatted
        }
      )
      .subscribe(
        ans => {
          this.ingreso_bruto = ans["result"]["ingreso_bruto"];
          this.ingreso_neto = ans["result"]["ingreso_neto"];
          this.valor_transado = ans["result"]["valor_transado"];
          this.precio_porcentaje = ans["result"]["precio_porcentaje"];
          this.rendimiento_neto = ans["result"]["rendimiento_neto"];
          this.total_pagar = ans["result"]["total_pagar"];
          this.comision_bolsa = ans["result"]["comision_bolsa"];
          this.comision_casa = ans["result"]["comision_casa"];
          this.plazo = ans["result"]["plazo"];
          this.interes_acumulado = ans["result"]["interes_acumulado"];
          this.fecha_inicio_vigencia = ans["result"]["fecha_inicio_vigencia"];

          this.pburObject = {
            valor_nominal: this.investmentProposalForm.value.valor_nominal,
            renta_porcentaje: this.investmentProposalForm.value
              .renta_porcentaje,
            comision_casa_porcentaje: this.investmentProposalForm.value
              .comision_casa_porcentaje,
            comision_bolsa_porcentaje: this.investmentProposalForm.value
              .comision_bolsa_porcentaje,
            comision_casa: ans["result"]["comision_casa"],
            comision_bolsa: ans["result"]["comision_bolsa"],
            rendimiento_bruto: this.investmentProposalForm.value
              .rendimiento_bruto,
            otros_costos: this.investmentProposalForm.value.otros_costos,
            ingreso_bruto: ans["result"]["ingreso_bruto"],
            ingreso_neto: ans["result"]["ingreso_neto"],

            valor_transado: ans["result"]["valor_transado"],
            precio_porcentaje: ans["result"]["precio_porcentaje"],
            rendimiento_neto: ans["result"]["rendimiento_neto"],
            total_pagar: ans["result"]["total_pagar"],
            interes_acumulado: ans["result"]["interes_acumulado"],
            fecha_inicio_vigencia: ans["result"]["fecha_inicio_vigencia"],
            plazo: this.investmentProposalForm.value.plazo,
            //id_formato_ingreso: this.investmentProposalForm.value.id_formato_ingreso,

            fecha_operacion: this.investmentProposalForm.value.fecha_operacion
              .singleDate.formatted,
            fecha_liquidacion:
              this.investmentProposalForm.value.fecha_liquidacion.singleDate
                .formatted || "",
            fecha_ultima_cupon:
              this.investmentProposalForm.value.fecha_ultima_cupon != undefined
                ? this.investmentProposalForm.value.fecha_ultima_cupon
                    .singleDate.formatted
                : "",
            fecha_vencimiento:
              this.investmentProposalForm.value.fecha_vencimiento != undefined
                ? this.investmentProposalForm.value.fecha_vencimiento.singleDate
                    .formatted
                : ""
          };
          this.formDataService.setWork(this.pburObject);
          Swal.close();
          if (saveForm == true) {
            if (this.investmentID != undefined) {
              this.router.navigate(["/investment-proposal/complement-info"], {
                queryParams: { id: this.investmentID }
              });
            } else {
              this.router.navigate(["/investment-proposal/complement-info"]);
            }
          }
        },
        err => {
          Swal.fire({
            icon: "error",
            title: "Error en el servidor",
            text: "No su pudo obtener la informacion"
          });
          return false;
        }
      );
  }

  goToPrevious() {
    this.submitted = true;
    if (this.investmentID != undefined) {
      this.router.navigate(["/investment-proposal/general-info"], {
        queryParams: { id: this.investmentID }
      });
    } else {
      this.router.navigate(["/investment-proposal/general-info"]);
    }
  }

  goToNext(form: any) {
    this.getCalculations(form, true);
  }
}
