import type { TguPlanUi, TguPlatformUi, TimelineRange } from "../../../model/timelineTypes";

export type EditorWorkKind = "shoot" | "downlink";

export type EditorWorkOrigin = "plan" | "added";

export type EditorWorkBase = {
  id: string;
  kind: EditorWorkKind;
  label: string;
  startMs: number;
  endMs: number;
  origin: EditorWorkOrigin;
  isNew?: boolean;
  /** Объём включения, МБ (считает бэк: скорость × длительность). Есть у включений плана и сохранённых правок. */
  volumeMb?: number;
};

export type EditorShootWork = EditorWorkBase & {
  kind: "shoot";
  modeId?: string;
  targetName?: string;
  targetLat?: number;
  targetLon?: number;
  /** Идентификатор сохранённого режима съёмки в БД (есть у включений плана). */
  planModeId?: number;
  /** Номер витка. */
  revolution?: number;
  /** Крен (gamma), град. */
  rollDeg?: number;
  /** Угол захвата (полуширина полосы), град. Есть только у свежепостроенного маршрута. */
  captureAngleDeg?: number;
  /** Центр контура съёмки, град. */
  centerLat?: number;
  centerLon?: number;
};

export type EditorDownlinkWork = EditorWorkBase & {
  kind: "downlink";
  stationId?: string;
  /** Идентификатор сохранённого режима сброса в БД (есть у включений плана). */
  planModeId?: number;
  /** Номер витка зоны радиовидимости. */
  revolution?: number;
  /** Идентификаторы режимов съёмки (survey_modes), сбрасываемых в этом сеансе. */
  surveyIds?: number[];
};

export type EditorWork = EditorShootWork | EditorDownlinkWork;

export type EditorWorkPatch =
  Partial<Omit<EditorWorkBase, "id" | "kind">> &
  Partial<Pick<EditorShootWork, "modeId" | "targetLat" | "targetLon" | "targetName">> &
  Partial<Pick<EditorDownlinkWork, "stationId">>;

export type Draft = {
  planId?: string;
  spacecraftId?: string;
  works: EditorWork[];
};

export type DraftHistory = {
  draft: Draft;
  past: Draft[];
  future: Draft[];
};

export type EditorTarget = {
  id: string;
  name: string;
  lat: number;
  lon: number;
};

export type EditorGroundStation = {
  id: string;
  name: string;
  lat?: number;
  lon?: number;
};

export type EditorVisibilityWindow = {
  startMs: number;
  endMs: number;
  quality: number;
  /** Номер витка (если окно получено из баллистики). */
  revolution?: number;
  /** Крен, град. */
  rollDeg?: number;
  /** Угол Солнца, град. */
  sunAngleDeg?: number;
  /** Наклонная дальность. */
  range?: number;
  /** Направление витка. */
  revSign?: "ASC" | "DESC";
};

export type EditorVisibilityTrack = {
  id: string;
  label: string;
  kind: "target" | "station";
  color: string;
  windows: EditorVisibilityWindow[];
};

export type EditorTimelineWindow = {
  fromMs: number;
  toMs: number;
};

export type EditorContextLane = {
  spacecraftId: string;
  label: string;
  works: EditorWork[];
};

export type EditorMode = {
  id: string;
  label: string;
};

export type EditorCheckContext = {
  spacecraftId?: string;
  stations: EditorGroundStation[];
  marginMs?: number;
};

export type TguEditorTabProps = {
  selectedSpacecraftId?: string;
  selectedPlan?: TguPlanUi;
  appliedRange: TimelineRange;
  platforms: TguPlatformUi[];
};
