import {PhotoDTO} from '../../../../../common/entities/PhotoDTO';
import {MediaDTO} from '../../../../../common/entities/MediaDTO';

export class GridRowBuilder {

  private photoRow: MediaDTO[] = [];

  private photoIndex = 0; // index of the last pushed media to the photoRow


  constructor(private photos: MediaDTO[],
              private startIndex: number,
              private photoMargin: number,
              private containerWidth: number) {
    this.photoIndex = startIndex;
    if (this.containerWidth <= 0) {
      throw new Error('container width cant be <=0, got:' + this.containerWidth);
    }
  }

  public addPhotos(number: number) {
    for (let i = 0; i < number; i++) {
      this.addPhoto();
    }
  }

  private addPhoto(): boolean {
    if (this.photoIndex + 1 > this.photos.length) {
      return false;
    }
    this.photoRow.push(this.photos[this.photoIndex]);
    this.photoIndex++;
    return true;
  }

  public removePhoto(): boolean {
    if (this.photoIndex - 1 < this.startIndex) {
      return false;
    }
    this.photoIndex--;
    this.photoRow.pop();
    return true;
  }

  public getPhotoRow(): MediaDTO[] {
    return this.photoRow;
  }

  public adjustRowHeightBetween(minHeight: number, maxHeight: number) {
    while (this.calcRowHeight() > maxHeight && this.addPhoto() === true) { // row too high -> add more images
    }

    while (this.calcRowHeight() < minHeight && this.removePhoto() === true) { // roo too small -> remove images
    }

    // keep at least one media int thr row
    if (this.photoRow.length <= 0) {
      this.addPhoto();
    }
  }

  public calcRowHeight(): number {
    let width = 0;
    for (let i = 0; i < this.photoRow.length; i++) {
      const size = MediaDTO.getRotatedSize(this.photoRow[i]);
      width += (size.width / size.height); // summing up aspect ratios
    }
    const height = (this.containerWidth - this.photoRow.length * (this.photoMargin * 2) - 1) / width; // cant be equal -> width-1

    return height + (this.photoMargin * 2);
  }
}
