import {Component} from '@angular/core';
import {ElementRef, Input} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';

import {EnvProperties} from '../../../utils/properties/env-properties';
import {ResultLandingInfo} from '../../../utils/entities/resultLandingInfo';
import {RouterHelper} from '../../../utils/routerHelper.class';
import {ErrorCodes} from '../../../utils/properties/errorCodes';

import {DeletedByInferenceService} from './deletedByInference.service';
import {ResultPreview} from "../../../utils/result-preview/result-preview";
import {AlertModal} from "../../../utils/modal/alert";
import {Subscriber} from "rxjs";
import {properties} from "../../../../../environments/environment";
import {HelperFunctions} from "../../../utils/HelperFunctions.class";

@Component({
  selector: 'deletedByInference',
  template: `
    <div id="versions_container">
      <errorMessages [status]="[status]" [type]="type" tab_error_class=true></errorMessages>
      <no-load-paging *ngIf="results.length > pageSize" [type]="type"
                      (pageChange)="updatePage($event)"
                      [page]="page" [pageSize]="pageSize"
                      [totalResults]="results.length">
      </no-load-paging>
      <ul class="uk-list uk-margin">
        <li *ngFor="let result of results.slice((page-1)*pageSize, page*pageSize)">
          <result-preview [modal]="modal" [properties]="properties" [hasLink]="false" [result]="getResultPreview(result)" 
                          [showOrcid]="false" [prevPath]="prevPath" [showInline]="true" 
                          [isDeletedByInferenceModal]="true"></result-preview>
        </li>
      </ul>
      <no-load-paging *ngIf="results.length > pageSize" [type]="type"
                      (pageChange)="updatePage($event)"
                      [page]="page" [pageSize]="pageSize"
                      [totalResults]="results.length">
      </no-load-paging>
    </div>
  `
})
export class DeletedByInferenceComponent {
  @Input() prevPath: string = "";
  public results: ResultLandingInfo[] = [];
  @Input() id: string;
  @Input() ids: string[] = [];
  @Input() type: string;
  @Input() resultType: string;
  @Input() modal: AlertModal;
  
  // Custom tab paging variables
  public page: number = 1;
  public pageSize: number = 5;
  
  public status: number;
  public routerHelper: RouterHelper = new RouterHelper();
  public errorCodes: ErrorCodes = new ErrorCodes();
  
  subscriptions = [];
  properties: EnvProperties;
  
  constructor(private element: ElementRef,
              private _deletedByInferenceService: DeletedByInferenceService,
              private route: ActivatedRoute) {
  }
  
  ngOnInit() {

        this.properties = properties;
        

    this.subscriptions.push(this.route.queryParams.subscribe(data => {
      this.errorCodes = new ErrorCodes();
      this.status = this.errorCodes.LOADING;
      
      this.getDeletedByInference();
    }));
  }

  ngOnDestroy() {
    this.subscriptions.forEach(subscription => {
      if (subscription instanceof Subscriber) {
        subscription.unsubscribe();
      }
    });
  }
  
  getDeletedByInference() {
    this.results = [];
    this.status = this.errorCodes.LOADING;
    this.subscriptions.push(this._deletedByInferenceService.getDeletedByInferenceResults(this.id, String(this.ids.length), this.properties).subscribe(
      data => {
        this.results = data;
        this.status = this.errorCodes.DONE;
      },
      error => {
        if (error.status == '404') {
          this.status = this.errorCodes.NOT_FOUND;
        } else if (error.status == '500') {
          this.status = this.errorCodes.ERROR;
        } else {
          this.status = this.errorCodes.NOT_AVAILABLE;
        }
      }
    ));
  }
  
  public getResultPreview(result: ResultLandingInfo): ResultPreview {
    return ResultPreview.resultLandingInfoConvert(result, this.resultType);
  }
  
  public totalPages(totalResults: number): number {
    let totalPages: any = totalResults / this.pageSize;
    if (!(Number.isInteger(totalPages))) {
      totalPages = (parseInt(totalPages, this.pageSize) + 1);
    }
    return totalPages;
  }
  
  public updatePage($event) {
    this.page = $event.value;
    HelperFunctions.scrollToId("versions_container");
  }
}
