import { Inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { ApiMethodBase } from 'oapi3codegen-agent-angular/api-method.base';
import { ApiSchema } from 'oapi3codegen-agent-angular/api-schema';
import {
  SERVERS_DATA,
  ServersData
} from 'oapi3codegen-agent-angular/servers.data.provider';
import {
  API_ERROR_HANDLER,
  ApiErrorHandler
} from 'oapi3codegen-agent-angular/event-manager.provider';

// Typings for this API method
import {
  GetSimilarParametersResponse,
  GetSimilarParametersRequest
} from '../typings';

import * as domainSchema from './stock-cars.json';

/**
 * Service for angular based on ApiAgent solution.
 * Provides assured request to API method with implicit
 * validation and common errors handling scheme.
 */
@Injectable()
export class GetSimilarParametersService extends ApiMethodBase<
  GetSimilarParametersResponse,
  GetSimilarParametersRequest,
  null
> {
  protected get method(): 'POST' {
    return 'POST';
  }

  /**
   * Path template, example: `/some/path/{id}`.
   * @returns {string}
   */
  protected get pathTemplate(): string {
    return '/stock-cars/similar/parameters';
  }

  /**
   * Parameters in a query.
   * @returns {string[]}
   */
  protected get queryParams(): string[] {
    return [];
  }

  /**
   * API servers.
   * @returns {string[]}
   */
  protected get servers(): string[] {
    return ['http://lk.cm.local/api/site/'];
  }

  /**
   * Complete domain API schema (OAS3) with library
   * of models.
   * @returns {SubSchema}
   */
  protected get domainSchema(): any {
    return domainSchema;
  }

  /**
   * JSON Schemas using for validations at requests.
   * @returns {Schema}
   */
  protected get schema(): ApiSchema {
    return {
      response: {
        type: 'object',
        additionalProperties: {
          description:
            'Перечисление возможных вариантов значений для свойства, указанного как ключ',
          type: 'array',
          items: {
            $ref: 'stock-cars.json#/components/schemas/DictionaryValueMeta'
          }
        },
        example: {
          engineType: [
            { value: 1, title: 'Бензиновый' },
            { value: 2, title: 'Дизельный' }
          ],
          driveType: [
            { value: 1, title: 'Передний' },
            { value: 5, title: 'Полный' }
          ],
          bodyDoors: [
            { value: { body: 4, doors: null }, title: 'Внедорожник' },
            { value: { body: 4, doors: 5 }, title: 'Внедорожник 5 дв.' }
          ],
          gearType: [
            { value: 1, title: 'Автомат' },
            { value: 2, title: 'Механика' }
          ],
          color: [
            { value: 16, title: 'черный' },
            { value: 13, title: 'серый' },
            { value: 12, title: 'серебряный' },
            { value: 2, title: 'белый' },
            { value: 1, title: 'бежевый' },
            { value: 6, title: 'золотой' },
            { value: 9, title: 'оранжевый' },
            { value: 7, title: 'коричневый' },
            { value: 8, title: 'красный' },
            { value: 15, title: 'фиолетовый' },
            { value: 10, title: 'пурпурный' },
            { value: 14, title: 'синий' },
            { value: 3, title: 'голубой' }
          ],
          engineVolume: [
            { value: 1, title: '1' },
            { value: 1.1, title: '1.1' },
            { value: 1.2, title: '1.2' },
            { value: 1.3, title: '1.3' },
            { value: 1.4, title: '1.4' },
            { value: 1.5, title: '1.5' },
            { value: 1.6, title: '1.6' },
            { value: 1.7, title: '1.7' },
            { value: 1.8, title: '1.8' },
            { value: 1.9, title: '1.9' },
            { value: 2, title: '2' },
            { value: 2.1, title: '2.1' },
            { value: 2.2, title: '2.2' },
            { value: 2.3, title: '2.3' },
            { value: 2.4, title: '2.4' }
          ],
          creationYear: [
            { value: 2010, title: 2010 },
            { value: 2011, title: 2011 },
            { value: 2012, title: 2012 }
          ],
          generation: [
            { value: 1, title: '' },
            { value: 5778, title: '2 поколение [рестайлинг]' },
            { value: 5014, title: '3 поколение' }
          ],
          enginePower: [
            { title: 1, value: 1 },
            { title: 105, value: 105 },
            { title: 112, value: 112 },
            { title: 115, value: 115 },
            { title: 120, value: 120 },
            { title: 136, value: 136 },
            { title: 142, value: 142 },
            { title: 143, value: 143 },
            { title: 150, value: 150 },
            { title: 163, value: 163 },
            { title: 176, value: 176 },
            { title: 180, value: 180 },
            { title: 184, value: 184 },
            { title: 188, value: 188 },
            { title: 261, value: 261 },
            { title: 313, value: 313 }
          ],
          wheelType: [
            { value: 1, title: 'Левый' },
            { value: 2, title: 'Правый' }
          ],
          climateControl: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          ac: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          parktronic: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          cruiseControl: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          startStopEngine: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          powerWindows: [
            { value: 1, title: 'все' },
            { value: 2, title: 'передние' },
            { value: -1, title: 'не указано' }
          ],
          navigationSystem: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          backCamera: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          powerSteering: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          abs: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          esp: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          tcs: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          eds: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          airbagFront: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          airbagSide: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          airbagWindow: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          airbagKnees: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          alarm: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          armored: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          diskSize: [
            { value: 10, title: '12' },
            { value: 9, title: '13' },
            { value: 5, title: '14' },
            { value: 6, title: '15' },
            { value: 4, title: '16' },
            { value: 7, title: '17' },
            { value: 1, title: '18' },
            { value: 3, title: '19' },
            { value: 2, title: '20' },
            { value: 11, title: '21' },
            { value: 8, title: '22' },
            { value: 15, title: '23' },
            { value: 16, title: '24' },
            { value: 17, title: '25' },
            { value: 18, title: '26' },
            { value: 19, title: '27' },
            { value: 20, title: '28' },
            { value: -1, title: 'не указано' }
          ],
          diskType: [
            { value: 1, title: 'легкосплавные' },
            { value: 2, title: 'стальные' },
            { value: -1, title: 'не указано' }
          ],
          winterTires: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          headlightType: [
            { value: 1, title: 'галогеновые' },
            { value: 2, title: 'ксеноновые' },
            { value: 4, title: 'светодиодные' },
            { value: -1, title: 'не указано' }
          ],
          fogLights: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          airSuspension: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          aerography: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          upholstery: [
            { value: 5, title: 'алькантара' },
            { value: 1, title: 'велюр' },
            { value: 2, title: 'кожа' },
            { value: 3, title: 'комбинированная' },
            { value: 10, title: 'ткань' },
            { value: -1, title: 'не указано' }
          ],
          heatedSeats: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          thirdRowSeats: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          sunroof: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          panoramicRoof: [
            { value: true, title: 'есть' },
            { value: false, title: 'не указано' }
          ],
          source: [
            { title: 'auto.ru', value: 487 },
            { title: 'avito.ru', value: 488 }
          ],
          ownerType: [
            { title: 'Частные', value: 1 },
            { title: 'Автосалоны', value: 2 }
          ],
          status: [
            { title: 'Актуальные', value: 1 },
            { title: 'Недавние (2 мес)', value: 2 },
            { title: 'Недавние (4 мес)', value: 3 },
            { title: 'Архивные (2 мес)', value: 4 },
            { title: 'Архивные (4 мес)', value: 5 }
          ],
          airbag: [
            {
              value: {
                airbagFront: true,
                airbagSide: null,
                airbagWindow: null,
                airbagKnees: null
              },
              title: 'Фронтальные'
            },
            {
              value: {
                airbagFront: null,
                airbagSide: true,
                airbagWindow: null,
                airbagKnees: null
              },
              title: 'Боковые'
            },
            {
              value: {
                airbagFront: null,
                airbagSide: null,
                airbagWindow: true,
                airbagKnees: null
              },
              title: 'Оконные'
            },
            {
              value: {
                airbagFront: null,
                airbagSide: null,
                airbagWindow: null,
                airbagKnees: true
              },
              title: 'Коленные'
            },
            {
              value: {
                airbagFront: false,
                airbagSide: false,
                airbagWindow: false,
                airbagKnees: false
              },
              title: 'не указано'
            }
          ]
        },
        description: 'Варианты значений'
      },
      request: {
        type: 'object',
        properties: {
          stockCar: { $ref: 'stock-cars.json#/components/schemas/StockCar' },
          similarCarSearch: {
            $ref: 'stock-cars.json#/components/schemas/SimilarCarSearch'
          }
        }
      },
      params: null
    } as any;
  }

  /**
   * Mock data when servers is disabled (in DEV-mode).
   * @returns {any}
   */
  protected get mockData(): any {
    return {
      engineType: [
        { value: 1, title: 'Бензиновый' },
        { value: 2, title: 'Дизельный' }
      ],
      driveType: [
        { value: 1, title: 'Передний' },
        { value: 5, title: 'Полный' }
      ],
      bodyDoors: [
        { value: { body: 4, doors: null }, title: 'Внедорожник' },
        { value: { body: 4, doors: 5 }, title: 'Внедорожник 5 дв.' }
      ],
      gearType: [
        { value: 1, title: 'Автомат' },
        { value: 2, title: 'Механика' }
      ],
      color: [
        { value: 16, title: 'черный' },
        { value: 13, title: 'серый' },
        { value: 12, title: 'серебряный' },
        { value: 2, title: 'белый' },
        { value: 1, title: 'бежевый' },
        { value: 6, title: 'золотой' },
        { value: 9, title: 'оранжевый' },
        { value: 7, title: 'коричневый' },
        { value: 8, title: 'красный' },
        { value: 15, title: 'фиолетовый' },
        { value: 10, title: 'пурпурный' },
        { value: 14, title: 'синий' },
        { value: 3, title: 'голубой' }
      ],
      engineVolume: [
        { value: 1, title: '1' },
        { value: 1.1, title: '1.1' },
        { value: 1.2, title: '1.2' },
        { value: 1.3, title: '1.3' },
        { value: 1.4, title: '1.4' },
        { value: 1.5, title: '1.5' },
        { value: 1.6, title: '1.6' },
        { value: 1.7, title: '1.7' },
        { value: 1.8, title: '1.8' },
        { value: 1.9, title: '1.9' },
        { value: 2, title: '2' },
        { value: 2.1, title: '2.1' },
        { value: 2.2, title: '2.2' },
        { value: 2.3, title: '2.3' },
        { value: 2.4, title: '2.4' }
      ],
      creationYear: [
        { value: 2010, title: 2010 },
        { value: 2011, title: 2011 },
        { value: 2012, title: 2012 }
      ],
      generation: [
        { value: 1, title: '' },
        { value: 5778, title: '2 поколение [рестайлинг]' },
        { value: 5014, title: '3 поколение' }
      ],
      enginePower: [
        { title: 1, value: 1 },
        { title: 105, value: 105 },
        { title: 112, value: 112 },
        { title: 115, value: 115 },
        { title: 120, value: 120 },
        { title: 136, value: 136 },
        { title: 142, value: 142 },
        { title: 143, value: 143 },
        { title: 150, value: 150 },
        { title: 163, value: 163 },
        { title: 176, value: 176 },
        { title: 180, value: 180 },
        { title: 184, value: 184 },
        { title: 188, value: 188 },
        { title: 261, value: 261 },
        { title: 313, value: 313 }
      ],
      wheelType: [{ value: 1, title: 'Левый' }, { value: 2, title: 'Правый' }],
      climateControl: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      ac: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      parktronic: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      cruiseControl: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      startStopEngine: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      powerWindows: [
        { value: 1, title: 'все' },
        { value: 2, title: 'передние' },
        { value: -1, title: 'не указано' }
      ],
      navigationSystem: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      backCamera: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      powerSteering: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      abs: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      esp: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      tcs: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      eds: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      airbagFront: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      airbagSide: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      airbagWindow: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      airbagKnees: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      alarm: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      armored: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      diskSize: [
        { value: 10, title: '12' },
        { value: 9, title: '13' },
        { value: 5, title: '14' },
        { value: 6, title: '15' },
        { value: 4, title: '16' },
        { value: 7, title: '17' },
        { value: 1, title: '18' },
        { value: 3, title: '19' },
        { value: 2, title: '20' },
        { value: 11, title: '21' },
        { value: 8, title: '22' },
        { value: 15, title: '23' },
        { value: 16, title: '24' },
        { value: 17, title: '25' },
        { value: 18, title: '26' },
        { value: 19, title: '27' },
        { value: 20, title: '28' },
        { value: -1, title: 'не указано' }
      ],
      diskType: [
        { value: 1, title: 'легкосплавные' },
        { value: 2, title: 'стальные' },
        { value: -1, title: 'не указано' }
      ],
      winterTires: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      headlightType: [
        { value: 1, title: 'галогеновые' },
        { value: 2, title: 'ксеноновые' },
        { value: 4, title: 'светодиодные' },
        { value: -1, title: 'не указано' }
      ],
      fogLights: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      airSuspension: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      aerography: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      upholstery: [
        { value: 5, title: 'алькантара' },
        { value: 1, title: 'велюр' },
        { value: 2, title: 'кожа' },
        { value: 3, title: 'комбинированная' },
        { value: 10, title: 'ткань' },
        { value: -1, title: 'не указано' }
      ],
      heatedSeats: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      thirdRowSeats: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      sunroof: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      panoramicRoof: [
        { value: true, title: 'есть' },
        { value: false, title: 'не указано' }
      ],
      source: [
        { title: 'auto.ru', value: 487 },
        { title: 'avito.ru', value: 488 }
      ],
      ownerType: [
        { title: 'Частные', value: 1 },
        { title: 'Автосалоны', value: 2 }
      ],
      status: [
        { title: 'Актуальные', value: 1 },
        { title: 'Недавние (2 мес)', value: 2 },
        { title: 'Недавние (4 мес)', value: 3 },
        { title: 'Архивные (2 мес)', value: 4 },
        { title: 'Архивные (4 мес)', value: 5 }
      ],
      airbag: [
        {
          value: {
            airbagFront: true,
            airbagSide: null,
            airbagWindow: null,
            airbagKnees: null
          },
          title: 'Фронтальные'
        },
        {
          value: {
            airbagFront: null,
            airbagSide: true,
            airbagWindow: null,
            airbagKnees: null
          },
          title: 'Боковые'
        },
        {
          value: {
            airbagFront: null,
            airbagSide: null,
            airbagWindow: true,
            airbagKnees: null
          },
          title: 'Оконные'
        },
        {
          value: {
            airbagFront: null,
            airbagSide: null,
            airbagWindow: null,
            airbagKnees: true
          },
          title: 'Коленные'
        },
        {
          value: {
            airbagFront: false,
            airbagSide: false,
            airbagWindow: false,
            airbagKnees: false
          },
          title: 'не указано'
        }
      ]
    } as any;
  }

  // *** Methods

  /**
   * @param {HttpClient} httpClient
   * @param {ApiErrorHandler} errorHandler
   * Обработчик ошибок HTTP-запросов и
   * @param {ServersData} serversData
   */
  constructor(
    protected httpClient: HttpClient,
    @Inject(API_ERROR_HANDLER) protected errorHandler: ApiErrorHandler,
    @Inject(SERVERS_DATA) protected serversData: ServersData
  ) {
    super(httpClient, errorHandler, serversData, domainSchema);
  }
}
