import { Nullable } from '../../../types/general';
import { CalendarDate } from '../calendar-date';
/**
 * CalendarPeriod is an abstract class that represents a period of date for calendar.
 */
export declare abstract class CalendarPeriod {
  protected _startDate: CalendarDate;
  protected _endDate: CalendarDate;
  protected _current: CalendarDate;
  private readonly _count;
  private readonly _timezone?;
  protected abstract readonly _type: string;
  protected abstract _showWeekends: boolean;
  protected constructor(count: number, current: Nullable<CalendarDate>, timezone?: string);
  /**
   * The current date of the period.
   *
   * @type {CalendarDate}
   */
  get current(): CalendarDate;
  /**
   * The start date of the period
   *
   * @type {CalendarDate}
   */
  get startDate(): CalendarDate;
  /**
   * The end date of the period
   *
   * @type {CalendarDate}
   */
  get endDate(): CalendarDate;
  /**
   * The count of the period
   *
   * @type {number}
   */
  get count(): number;
  /**
   * This function returns the type of the object.
   *
   * @type {string}
   */
  get type(): string;
  /**
   * This function returns the showWeekends of the object.
   *
   * @type {boolean}
   */
  get showWeekends(): boolean;
  /**
   * The timezone of the period.
   *
   * @type {string | undefined}
   */
  get timezone(): string | undefined;
  /**
   * Go to a specific date.
   *
   * @param {CalendarDate} date - The date to go to.
   * @returns {this} - The current period.
   */
  goTo(date: CalendarDate): this;
  /**
   * Go to now.
   *
   * @returns {this} - The current period.
   */
  now(): this;
  /**
   * Check the give period is equal to current period
   *
   * @param {CalendarPeriod} [period] - Give period to compare
   * @returns {boolean} compare result
   */
  equal(period: CalendarPeriod): boolean;
  /**
   * Calculate the period start date and end date.
   *
   * @param {CalendarDate} date - The date to calculate the period from.
   */
  protected calculatePeriod(date: CalendarDate): void;
  /**
   * Set the current period to the next.
   *
   * @returns {this} - The updated period
   */
  abstract next(): this;
  /**
   * Set the current period to the previous.
   *
   * @returns {this} - The updated period
   */
  abstract previous(): this;
  /**
   * Create a new period by the given date.
   *
   * @param {CalendarDate} current - The date to create the period from.
   * @returns {this} - The new period.
   */
  protected abstract createBy(current: CalendarDate): this;
}
