// Типы слотов покрытия и бронирования. Зеркалят DTO из pcp-types-lib
// (space.nstart.pcp.pcp_types_lib.dto.requests.slots), которые отдаёт slots-service.

/** Признак ветви витка (восходящая/нисходящая). */
export type RevolutionSign = "ASC" | "DESC";

/**
 * Стратегия автоформирования покрытия (slots-service: SlotCoverageStrategy).
 * GREEDY — жадный подбор; CONTINUOUS — непрерывное покрытие. Не задано — все слоты-кандидаты.
 */
export type SlotCoverageStrategy = "GREEDY" | "CONTINUOUS";

/** Статус слота из расчёта покрытия (slots-service: SlotStatus). BUSY — слот занят чужой/этой
 *  бронью на этом проходе КА: показываем для обзора, но забронировать нельзя. */
export type SlotStatus = "AVAILABLE" | "BOOKED" | "BUSY" | "PROCESSED" | string;

/**
 * Держатель занятого (BUSY) слота — заявка, чья бронь блокирует слот (slots-service: SlotHolderDTO).
 * name/importance могут отсутствовать, если request-service недоступен (деградация — показываем id).
 */
export type SlotHolder = {
  requestId: string;
  name?: string | null;
  importance?: number | null;
};

/** Слот покрытия заявки — кандидат на бронирование (slots-service: SlotDTO). */
export type SlotDTO = {
  cycle: number;
  satelliteId: number;
  tn: string;
  tk: string;
  roll: number;
  /** Контур полосы слота в WKT (POLYGON ...) — рисуем на 2D-карте. */
  contour: string;
  revolution: number;
  revolutionSign: RevolutionSign;
  slotNumber: number;
  state: SlotStatus;
  latitude: number;
  longitude: number;
  /** Держатели BUSY-слота (обзор конфликтов, all=true). Пусто/нет для свободных и брони. */
  holders?: SlotHolder[] | null;
};

/** Забронированный слот (slots-service: BookedSlotDTO) — ответ на POST booking/request. */
export type BookedSlotDTO = {
  bookedSlotId: number;
  satelliteId: number;
  slotNum: number;
  cycle: number;
};

/**
 * Забронированный слот для отображения и снятия (slots-service: BookedSlotViewDTO,
 * GET booking/by-request). Поля слота (контур, координаты) + bookedSlotId для снятия по id.
 * cycle здесь — цикл БРОНИ, поэтому slotKey совпадает с ответом POST booking/request.
 */
export type BookedSlotView = SlotDTO & { bookedSlotId: number };

/** Идентификатор слота для бронирования (slots-service: SlotBookingRequestDTO). */
export type SlotBookingRequest = {
  satelliteId: number;
  slotNum: number;
  cycle: number;
};

/** Параметры расчёта слотов покрытия заявки (GET /api/slots/request-cover). */
export type RequestSlotsParams = {
  requestId: string;
  timeStart: string;
  timeStop: string;
  /** Ветвь витка; не задано — обе ветви. */
  revSign?: RevolutionSign;
  /** true — считать ещё и площадь покрытия (дольше); false — только слоты-кандидаты. */
  cov?: boolean;
  /** Ограничение по КА; пусто — все доступные. */
  satellites?: number[];
  /** Угол Солнца, град (для оптики); не задано — без ограничения. */
  sun?: number;
  /** Стратегия автоформирования покрытия; не задано — все слоты-кандидаты. */
  coverageStrategy?: SlotCoverageStrategy;
  /** true — вернуть и занятые бронью слоты (BUSY) для обзора («Показать все слоты»). */
  all?: boolean;
};
