import { Component, OnInit } from '@angular/core';
import { Exercise } from 'app/shared/model/exercise.model';
import { SearchInput } from 'app/shared/model/search/search-input.model';
import { SearchService } from 'app/search/service/search-service';
import { SearchResultsDTO } from 'app/shared/model/search/search-results-dto.model';
import { SearchResultDTO } from 'app/shared/model/search/search-result-dto.model';
import { AccountService } from 'app/core/auth/account.service';

@Component({
  selector: 'jhi-search',
  templateUrl: './search.component.html',
  styleUrls: ['./search.scss'],
})
export class SearchComponent implements OnInit {
  results: Exercise[] = [];
  selectedResult?: Exercise;
  hitCount = 0;

  private searchInput: SearchInput = new SearchInput();

  constructor(protected searchService: SearchService, public accountService: AccountService) {}

  ngOnInit(): void {}

  selectExercise(exercise: Exercise): void {
    this.selectedResult = exercise;
  }

  updateSearchInput(searchInput: SearchInput): void {
    searchInput.page = 0;
    this.searchInput = searchInput;
    this.results = [];
    this.hitCount = 0;
    this.search();
  }

  private search(): void {
    if (
      this.searchInput.fulltextQuery ||
      this.searchInput.metadata.programmingLanguage ||
      this.searchInput.metadata.keyword ||
      this.searchInput.metadata.author ||
      this.searchInput.metadata.license
    ) {
      this.searchService.searchPageDetails(this.searchInput).subscribe(
        (data: SearchResultsDTO) => {
          const searchResults = this.parseSearchResultsDTO(data);
          this.results = this.results.concat(searchResults);
          ++this.searchInput.page;
        },
        () => alert('Search failed')
      );
    }
  }

  private parseSearchResultsDTO(searchResultsDTO: SearchResultsDTO): Exercise[] {
    this.hitCount = searchResultsDTO.hitCount;
    // fix string to date conversion: unfortunatelly dates are not converted correctly :-()
    searchResultsDTO.searchResult.forEach(hit => {
      // eslint-disable-next-line @typescript-eslint/camelcase
      hit.project.last_activity_at = new Date(hit.project.last_activity_at);
      // eslint-disable-next-line @typescript-eslint/camelcase
      hit.file.indexing_date = new Date(hit.file.indexing_date);
    });
    return searchResultsDTO.searchResult.map(this.searchResultToExercise);
  }

  private searchResultToExercise(searchResult: SearchResultDTO): Exercise {
    return {
      title: searchResult.metadata.title,
      license: searchResult.metadata.license,
      description: searchResult.metadata.description,
      programmingLanguages: searchResult.metadata.programmingLanguage,
      languages: searchResult.metadata.language,
      creators: searchResult.metadata.creator,
      contributor: searchResult.metadata.contributor,
      publisher: searchResult.metadata.publisher,
      imageURL: searchResult.metadata.image,
      rating: searchResult.ranking5,
      lastUpdate: searchResult.project.last_activity_at,
      timeRequired: searchResult.metadata.timeRequired,
      requires: searchResult.metadata.requires,
      deprecated: searchResult.metadata.deprecated,
      difficulty: searchResult.metadata.difficulty,
      educationLevel: searchResult.metadata.educationLevel,
      format: searchResult.metadata.format,
      keyword: searchResult.metadata.keyword,
      status: searchResult.metadata.status,
      type: searchResult.metadata.type,
      structure: searchResult.metadata.structure,
      version: searchResult.metadata.version,
      metadataVersion: searchResult.metadata.metadataVersion,

      gitlabURL: searchResult.project.url,
      originalResult: searchResult,
      views: searchResult.views,
      downloads: searchResult.downloads,
    };
  }

  onScroll(): void {
    this.search();
  }
}