// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

import React from 'react';
import ReactDOM from 'react-dom';
import { shallow } from 'enzyme';
import PartitionKeySelector from '../partition-key/PartitionKeySelector';
import sinon from 'sinon';

describe('PartitionKeySelector', () => {
  // const props = {
  //   includeDocs: false,
  //   queryOptionsToggleIncludeDocs: () => {},
  //   reduce: false,
  //   contentVisible: true,
  //   perPage: 10,
  //   queryOptionsToggleStable: () => {},
  //   queryOptionsChangeUpdate: () => {},
  //   stable: false,
  //   update: 'true'
  // };

  const defaultProps = {
    selectorVisible: true,
    partitionKey: '',
    checkDbPartitioned: () => {},
    onPartitionKeySelected: () => {}
  };

  it('is only rendered when selectorVisible is set to true', () => {
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      selectorVisible={false}
    />);
    expect(wrapper.find('div.partition-selector').exists()).toBe(false);

    const wrapper2 = shallow(<PartitionKeySelector
      {...defaultProps}
      selectorVisible={true}
    />);
    expect(wrapper2.find('div.partition-selector').exists()).toBe(true);
  });

  it('uses global mode by default', () => {
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      partitionKey='part1'
    />);

    const btLabel = wrapper.find('div').text();
    expect(btLabel).toMatch('No partition selected');
  });

  it('switches from global mode to partition mode when a key is already set', () => {
    const spyOnKeySelected = sinon.spy();
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      partitionKey='part1'
      globalMode={true}
      onPartitionKeySelected={spyOnKeySelected}
    />);

    wrapper.find('button').simulate('click');
    expect(spyOnKeySelected.calledOnce).toBe(true);
  });

  it('if a key is not set switching from global mode shows the text input', () => {
    const spyOnKeySelected = sinon.spy();
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      partitionKey=''
      globalMode={true}
      onPartitionKeySelected={spyOnKeySelected}
    />);

    expect(wrapper.state().editMode).toBe(false);
    wrapper.find('button').simulate('click');
    expect(wrapper.state().editMode).toBe(true);
    expect(spyOnKeySelected.calledOnce).toBe(false);
  });

  it('switches from partition mode to global mode', () => {
    const spyOnGlobalSelected = sinon.spy();
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      partitionKey='part1'
      globalMode={false}
      onGlobalModeSelected={spyOnGlobalSelected}
    />);

    wrapper.find('button').simulate('click');
    expect(spyOnGlobalSelected.calledOnce).toBe(true);
  });

  it('calls onPartitionKeySelected when a new value is set in the text input', () => {
    const spyOnKeySelected = sinon.spy();
    const wrapper = shallow(<PartitionKeySelector
      {...defaultProps}
      partitionKey=''
      globalMode={true}
      onPartitionKeySelected={spyOnKeySelected}
    />);

    // Start edit mode
    wrapper.find('button').simulate('click');
    expect(wrapper.state().editMode).toBe(true);
    // Set new value
    wrapper.find('input').simulate('change', { target: { value: 'new_part_key' } });
    wrapper.find('input').simulate('keypress', {key: 'Enter'});
    expect(spyOnKeySelected.calledOnce).toBe(true);
  });

});
