export type TguPlanStatus =
  | "ACCEPTED"
  | "REJECTED"
  | "WAITING_DECISION"
  | "PLANNED"
  | "ISSUING"
  | "START_AMBIGUOUS"
  | string;

export type TguPlanDecision = "ACCEPTED" | "REJECTED";

export type TguPlan = {
  planId: string;
  spacecraftId: string;
  startTime: string;
  endTime: string;
  kppId: string;
  status: TguPlanStatus;
  /**
   * Предшественник плана в цепочке. `null`/отсутствует — у плана нет предыстории (старт новой
   * цепочки «без истории» или самый первый план): на таймлайне в него не ведут стрелку.
   */
  basePlanId?: string | null;
  /** `true` — вычисленная проекция будущего (не persisted); цепочку продолжает, но стартом не является. */
  projected?: boolean;
  /**
   * Время «снятия с учёта» (ISO без зоны) терминально-негативного плана. `null`/отсутствует — план
   * на учёте. Снятый план гасится на таймлайне и не считается проблемой в индикаторе КА.
   */
  dismissedAt?: string | null;
};

export type TguPlatform = {
  id?: string | null;
  businessKey?: string | null;
  name?: string | null;
  status?: string | null;
  noradId?: number | string | null;
  mission?: string | null;
  validFrom?: string | null;
  validTo?: string | null;
};

export type TguPlanDecisionMessage = {
  eventId: string;
  spacecraftId: string;
  planId: string;
  attemptId: string;
  decision: TguPlanDecision;
  decisionTime: string;
  reason?: string | null;
};

export type TguApiErrorKind = "network" | "http";

export class TguApiError extends Error {
  readonly kind: TguApiErrorKind;
  readonly status?: number;

  constructor(message: string, kind: TguApiErrorKind, status?: number) {
    super(message);
    this.name = "TguApiError";
    this.kind = kind;
    this.status = status;
  }
}
