import { Route } from 'vue-router/types';

const defaultLimit = 15;

export default class HistoryStack extends Array {
  limit: number;

  constructor(limit?: number) {
    super();
    this.updateLimit(limit);
  }

  /**
   * Вернуть предыдущий путь
   */
  get previous(): Route {
    return this[1];
  }

  /**
   * Флаг наличия предыдущего пути
   */
  get hasPrevious(): boolean {
    return Boolean(window.history.state);
  }

  /**
   * Обновить максимальное количество элементов стеке
   */
  updateLimit(limit: number = defaultLimit): void {
    this.limit = limit;
  }

  /**
   * Добавить роут
   */
  add(route: Route): void {
    this.unshift(route);

    // Удалить страрейший, если стек переполнен
    if (this.limit && this.length > this.limit) {
      this.removeOldest();
    }
  }

  /**
   * Удалить самые старые элементы
   */
  private removeOldest(amount = 1): void {
    const shift = this.length - amount;
    this.splice(shift, amount);
  }

  /**
   * Удалить самые новые элементы
   */
  removeNewest(amount = 1): void {
    this.splice(0, amount);
  }
}
