wongjiahau/ttap-web

View on GitHub
src/ts/att/timePeriod.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { Time } from "./time";
export class TimePeriod {
  public static Max = Time.CreateTime12Hour(1, 0, true);
  public static Min = Time.CreateTime12Hour(11, 0, true);
  public static GetNumberOfHalfHours(): number {
    const NUMBER_OF_HALF_HOURS_PER_HOUR = 2;
    return (
      this.Max.Minus(this.Min).TotalHours() * NUMBER_OF_HALF_HOURS_PER_HOUR
    );
  }

  public static SetMinTo8am(): void {
    this.Min = Time.CreateTime12Hour(8, 0, false);
  }

  public static Parse(data: string): TimePeriod {
    const tokens = data.split("-");
    const startTime = tokens[0].trim();
    const endTime = tokens[1].trim();
    return new TimePeriod(Time.Parse(startTime), Time.Parse(endTime));
  }

  public static GenerateBinaryForm(t: TimePeriod): number {
    const MinutesInHalfHour = 30;
    const HowManyHalfHourPerHour = 2;
    const maxWidth = TimePeriod.GetNumberOfHalfHours();
    const width =
      t.EndTime.Minus(t.StartTime).TotalMinutes() / MinutesInHalfHour;
    let startIndex = (t.StartTime.Hour - TimePeriod.Min.Hour) * 2;
    if (t.StartTime.Minute === 30) {
      startIndex++;
    }
    const stringForm: string[] = [];
    for (let i = 0; i < maxWidth; i++) {
      stringForm.push("0");
    }
    for (let i = startIndex; i < startIndex + width; i++) {
      stringForm[i] = "1";
    }
    const result = parseInt(stringForm.reverse().join(""), 2);
    return result;
  }

  public StartTime: Time;
  public EndTime: Time;
  public BinaryData: number;

  public constructor(startTime: Time, endTime: Time) {
    if (startTime.LessThan(TimePeriod.Min)) {
      TimePeriod.Min = startTime;
    }
    if (endTime.MoreThan(TimePeriod.Max)) {
      TimePeriod.Max.Hour = endTime.Hour + (endTime.Minute > 0 ? 1 : 0);
    }
    this.StartTime = startTime;
    this.EndTime = endTime;
    this.BinaryData = TimePeriod.GenerateBinaryForm(this);
  }

  public Equal(other: TimePeriod): boolean {
    if (!this.EndTime.Equal(other.EndTime)) {
      return false;
    }
    if (!this.StartTime.Equal(other.StartTime)) {
      return false;
    }
    return true;
  }

  public GetDuplicate(): TimePeriod {
    return new TimePeriod(this.StartTime, this.EndTime);
  }

  public IntersectWith(other: TimePeriod): boolean {
    return (this.BinaryData & other.BinaryData) > 0;
    // if (this.StartTime.MoreThanOrEqual(other.EndTime)) {
    //     return false;
    // }
    // if (this.EndTime.LessThanOrEqual(other.StartTime)) {
    //     return false;
    // }
    // return true;
  }

  public GetStartTimeInIsoFormat(): string {
    return (
      this.pad(this.StartTime.Hour) + ":" + this.pad(this.StartTime.Minute)
    );
  }

  public GetEndTimeInIsoFormat(): string {
    return this.pad(this.EndTime.Hour) + ":" + this.pad(this.EndTime.Minute);
  }

  private pad(n: number): string {
    // pad numbers with leading zeros if it is less than 10
    return n < 10 ? "0" + n : n.toString();
  }
}