import { IntRange } from './int-range';
import { NumRange } from './num-range';
import { BodyDoors } from './body-doors';
import { Airbag } from './airbag';
import { Region } from './region';

/**
 * ## SimilarCarSearch
 * Модель, описывающая набор свойств автомобиля, по которым может быть произведен
 * поиск `SimilarCar` Сущность этой модели может быть отредактирована, например,
 * вручную пользователем, и набор параметров может кардинально отличаться от
 * исходной сущности `Car`, из которой изначально генерируется `SimilarCarSearch`.
 */
export interface SimilarCarSearch {
  /**
   * ## Brand
   * Наименование производителя
   */
  brand: number;

  /**
   * ## Model
   * Модель
   */
  model: number;

  generation: Array<number>;

  color?: Array<number>;

  /**
   * ## IntRange
   * Модель, описывающая диапазон целочисленных значений
   */
  creationYear?: IntRange;

  /**
   * ## IntRange
   * Модель, описывающая диапазон целочисленных значений
   */
  enginePower?: IntRange;

  /**
   * ## NumRange
   * Модель, описывающая диапазон вещественных значений
   */
  engineVolume?: NumRange;

  engineType?: Array<number>;

  vehicleType?: Array<number>;

  wheelType?: Array<number>;

  driveType?: Array<number>;

  gearType?: Array<number>;

  bodyDoors?: Array<BodyDoors>;

  /**
   * ## Подушки безопасности
   * Комплексное свойство содержащее в себе объединение четырех свойств —
   * airbagFront, airbagSide, airbagWindow, airbagKnees
   */
  airbag?: Airbag;

  bodyType?: Array<number>;

  doors?: Array<number>;

  /**
   * Регион (Geo-объект или координаты с радиусом)
   */
  region?: Region;

  /**
   * Тип владцельца объявления: `1` - частное объявление, `2` - автосалон.
   */
  ownerType?: number;

  source?: Array<number>;

  /**
   * ## status
   * Определяет статус поиска SimilarCar: `1` – Актуальные, `2` и `3` - Недавние (это
   * и актуальные и архивные) с разными сроком `4` и `5` – Архивные с разным сроком.
   */
  status?: number;

  /**
   * ## isExtendedByTwinsModels
   * Флаг описывает состояние, когда модель в `model` должна быть расширена с
   * моделями-близнецами в соответствии с алгоритмом объединенных моделей
   */
  isExtendedByTwinsModels?: boolean;

  /**
   * ## canExtendingByMixedModels
   * Флаг, который показывает возможность расширения модели по смешанному типу
   */
  canExtendingByMixedModels?: boolean;

  /**
   * ## canExtendingByTwinsModels
   * Флаг, которые показывает возможность расширения модели по типу близнеца
   */
  canExtendingByTwinsModels?: boolean;

  /**
   * ## manualExcludedIds
   * Список внешних идентификаторов SimilarCar, которые были исключены пользователем
   * вручную
   */
  manualExcludedIds?: Array<string>;

  /**
   * ## manualExcludedIds
   * Список внешних идентификаторов SimilarCar, которые были включены пользователем
   * вручную. данный список влияет на автоматическое исключение – перечисленные здесь
   * SimilarCar не будут исключены автоматически
   */
  manualIncludedIds?: Array<string>;

  /**
   * ## autoExcludedIds
   * Список внешних идентификаторов SimilarCar, которые были исключены автоматически
   * алгоритмами. Не исключаются автоматически manualIncludedIds
   */
  readonly autoExcludedIds?: Array<string>;

  /**
   * ## ClimateControl
   * Климат-контроль
   */
  climateControl?: boolean;

  /**
   * ## AC
   * Кондиционер
   */
  ac?: boolean;

  /**
   * ## Parktronic
   * Парктроник
   */
  parktronic?: boolean;

  /**
   * ## CruiseControl
   * Круиз-контроль
   */
  cruiseControl?: boolean;

  /**
   * ## StartStopEngine
   * Система старт-стоп
   */
  startStopEngine?: boolean;

  /**
   * ## PowerWindows
   * Электрические стеклоподъёмники
   */
  powerWindows?: number;

  /**
   * ## NavigationSystem
   * Навигационная система
   */
  navigationSystem?: boolean;

  /**
   * ## BackCamera
   * Камера заднего вида
   */
  backCamera?: boolean;

  /**
   * ## PowerSteering
   * Усилитель руля
   */
  powerSteering?: boolean;

  /**
   * ## ABS
   * Антиблокировочная система тормозов
   */
  abs?: boolean;

  /**
   * ## ESP
   * Система курсовой стабилизации
   */
  esp?: boolean;

  /**
   * ## TCS
   * Антипробуксовочная система
   */
  tsc?: boolean;

  /**
   * ## EDS
   * Система блокировки дифференциала
   */
  eds?: boolean;

  /**
   * ## AirbagFront
   * Фронтальные подушки безопасности
   */
  airbagFront?: boolean;

  /**
   * ## AirbagSide
   * Боковые подушки безопасности
   */
  airbagSide?: boolean;

  /**
   * ## AirbagWindow
   * Оконные подушки безопасности (шторки)
   */
  airbagWindow?: boolean;

  /**
   * ## AirbagKnees
   * Коленные подушки безопасности
   */
  airbagKnees?: boolean;

  /**
   * ## Alarm
   * Сигнализация
   */
  alarm?: boolean;

  /**
   * ## Armored
   * Бронированный
   */
  armored?: boolean;

  /**
   * ## DiskSize
   * Диаметр дисков
   */
  diskSize?: number;

  /**
   * ## DiskType
   * Тип дисков
   */
  diskType?: number;

  /**
   * ## WinterTires
   * Зимние шины
   */
  winterTires?: boolean;

  /**
   * ## HeadlightType
   * Тип фар
   */
  headlightType?: number;

  /**
   * ## FogLights
   * Противотуманные фары
   */
  fogLights?: boolean;

  /**
   * ## AirSuspension
   * Пневмоподвеска
   */
  airSuspension?: boolean;

  /**
   * ## Aerography
   * Аэрография
   */
  aerography?: boolean;

  /**
   * ## Upholstery
   * Обивка салона
   */
  upholstery?: number;

  /**
   * ## HeatedSeats
   * Сиденья с подогревом
   */
  heatedSeats?: boolean;

  /**
   * ## ThirdRowSeats
   * Третий ряд сидений
   */
  thirdRowSeats?: boolean;

  /**
   * ## Sunroof
   * Люк
   */
  sunroof?: boolean;

  /**
   * ## PanoramicRoof
   * Панорамная крыша
   */
  panoramicRoof?: boolean;

  /**
   * ## ObjectVersion
   * Версия объекта, обычно получается вместе с объектом из API, отправляется при
   * сохранении в неизменном виде. В случае, если за время между получением и
   * отправкой объекта на сохранения состояние объекта в API изменилось, то API
   * вернет 409 Conflict, в этом случае пользователю нужно сообщить, что объект уже
   * был изменен, поэтому требуется подтверждение сохранения (в этом случае нужно
   * испольщзовать параметр `forceSave`)
   */
  objectVersion?: number;
}
