import {browser, $} from 'protractor';
import {typeheadEl} from '../selectors.json';
import {leftPanelTests} from './leftPanelTests.po';
import {DataProvider} from '../data-provider/data-provider.po';

let using = require('jasmine-data-provider');

function getItemNumberInDropdown(itemNumber: any): any {
  return $('typeahead-container li:nth-child(' + itemNumber + ')>a');
}

function clearInputFields(): any {
  typeheadEl.inputStatic.clear();
  typeheadEl.inputTemplate.clear();
  typeheadEl.inputOption.clear();
  typeheadEl.inputAsynchronous.clear();
  typeheadEl.inputReactiveForms.clear();
  typeheadEl.inputGroupingResults.clear();
}

describe('Typeahead page tests on bootstrap 3', () => {
  beforeAll(() => {
    browser.get('#/typeahead');
    leftPanelTests.checkLeftPanelMini();
    leftPanelTests.checkLeftPanelMaxi();
    browser.ignoreSynchronization = false;
  });

  using(DataProvider.typeaheadDefaultTexts, (data: any, description: string) => {
    it('Check default texts: ' + description, () => {
      expect(data.element().getText()).toContain(data.actualResult);
    });
  });

  using(DataProvider.inputDifferentData, (data: any, description: string) => {
    it('Check input fields with different data: ' + description, () => {
      clearInputFields();
      typeheadEl.inputStatic.sendKeys(data.inputText);
      expect(typeheadEl.modelStatic.getText()).toBe('Model: ' + '"' + data.inputText + '"');

      typeheadEl.inputTemplate.sendKeys(data.inputText);
      expect(typeheadEl.modelTemplate.getText()).toBe('Model: ' + '"' + data.inputText + '"');

      typeheadEl.inputOption.sendKeys(data.inputText);
      expect(typeheadEl.modelOption.getText()).toBe('Model: ' + '"' + data.inputText + '"');

      typeheadEl.inputAsynchronous.sendKeys(data.inputText);
      expect(typeheadEl.modelAsynchronous.getText()).toBe('Model: ' + '"' + data.inputText + '"');

      typeheadEl.inputReactiveForms.sendKeys(data.inputText);
      expect(typeheadEl.modelReactiveForms.getText()).toBe('Model: ' + '"' + data.inputText + '"');

      typeheadEl.inputGroupingResults.sendKeys(data.inputText);
      expect(typeheadEl.modelGroupingResults.getText()).toBe('Model: ' + '"' + data.inputText + '"');
    });
  });

  using(DataProvider.typeaheadInputCityTexts, (data: any, description: string) => {
    it('Check items from dropdown: ' + description, () => {
      clearInputFields();
      typeheadEl.inputStatic.sendKeys(data.inputText);
      getItemNumberInDropdown(1).click();
      expect(typeheadEl.modelStatic.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');

      typeheadEl.inputTemplate.sendKeys(data.inputText);
      getItemNumberInDropdown(1).click();
      expect(typeheadEl.modelTemplate.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');

      typeheadEl.inputOption.sendKeys(data.inputText);
      getItemNumberInDropdown(1).click();
      expect(typeheadEl.modelOption.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');

      typeheadEl.inputAsynchronous.sendKeys(data.inputText);
      getItemNumberInDropdown(1).click();
      expect(typeheadEl.modelAsynchronous.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');

      typeheadEl.inputReactiveForms.sendKeys(data.inputText);
      getItemNumberInDropdown(1).click();
      expect(typeheadEl.modelReactiveForms.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');

      typeheadEl.inputGroupingResults.sendKeys(data.inputText);
      getItemNumberInDropdown(2).click();
      expect(typeheadEl.modelGroupingResults.getText()).toBe('Model: ' + '"' + data.expectedResult + '"');
    });
  });

  it('Check items in Static array', () => {
    typeheadEl.inputStatic.clear();
    typeheadEl.inputStatic.sendKeys('a');
    typeheadEl.staticArrayAlabama.click();
    expect(typeheadEl.modelStatic.getText()).toContain('Alabama');
  });

  it('Check items in Item template', () => {
    typeheadEl.inputTemplate.clear();
    typeheadEl.inputTemplate.sendKeys('a');
    typeheadEl.staticArrayAlabama.click();
    expect(typeheadEl.modelStatic.getText()).toContain('Alabama');
  });

  it('Check items in Option field', () => {
    typeheadEl.inputOption.clear();
    typeheadEl.inputOption.sendKeys('a');
    typeheadEl.staticArrayAlabama.click();
    expect(typeheadEl.modelOption.getText()).toContain('Alabama');
  });

  it('Check unfounded item in Async data results', () => {
    typeheadEl.inputAsynchronous.clear();
    typeheadEl.inputAsynchronous.sendKeys('1');
    expect(typeheadEl.errorMessageNoResultsFound.getText()).toContain('No Results Found');
  });

  it('Check dropdown list "Reactive forms" for empty value Model: (null)', () => {
    browser.refresh();
    expect(typeheadEl.modelReactiveForms.getText()).toEqual('Model: null');
  });

  it('Check grouping option at list "Grouping results"', () => {
    typeheadEl.inputGroupingResults.sendKeys('a');
    expect(typeheadEl.dropdownHeader.isDisplayed()).toBe(true);
  });

});
