export type Company =
  | "kmb"
  | "nlb"
  | "ctb"
  | "lrtfeeder"
  | "gmb"
  | "lightRail"
  | "mtr"
  | "gmbHki"
  | "gmbKln"
  | "gmbNt";

export type Terminal = {
  en: string;
  zh: string;
};

export type Freq = {
  [key in string]: {
    [startTime: string]: [string, string] | null;
  };
};

export type RouteListEntry = {
  readonly route: string;
  readonly co: Company[];
  readonly orig: Terminal;
  readonly dest: Terminal;
  readonly fares: string[] | null;
  readonly faresHoliday: string[] | null;
  readonly freq: Freq | null;
  readonly jt: string | null;
  readonly seq: number;
  readonly serviceType: string;
  readonly stops: {
    [co in Company]: string[];
  };
  readonly bound: {
    [co in Company]: "O" | "I" | "OI" | "IO";
  };
  readonly gtfsId: string;
  readonly nlbId: string;
};

export type Location = {
  lat: number;
  lng: number;
};

export type StopListEntry = {
  readonly location: Location;
  readonly name: {
    en: string;
    zh: string;
  };
};

export type StopTuple = [Company, string];

export type RouteList = Record<string, RouteListEntry>;

export type StopList = Record<string, StopListEntry>;

export type StopMap = Record<string, StopTuple[]>;

export type EtaDb = {
  holidays: string[];
  routeList: RouteList;
  stopList: StopList;
  stopMap: StopMap;
  serviceDayMap: Record<
    string,
    [0 | 1, 0 | 1, 0 | 1, 0 | 1, 0 | 1, 0 | 1, 0 | 1]
  >;
};

export type Eta = {
  eta: string;
  remark: {
    zh: string;
    en: string;
  };
  dest: {
    zh: string;
    en: string;
  };
  co: Company;
};
