/*!
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 *
 * 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 classNames from 'classnames';
import Checkbox from 'react-bootstrap/lib/Checkbox.js';
import { Radio } from 'onap-ui-react';
import FormGroup from 'react-bootstrap/lib/FormGroup.js';
import FormControl from 'react-bootstrap/lib/FormControl.js';

class InputWrapper extends React.Component {
    state = {
        value: this.props.value,
        checked: this.props.checked,
        selectedValues: []
    };

    render() {
        const {
            label,
            hasError,
            validations = {},
            isReadOnlyMode,
            value,
            onBlur,
            onKeyDown,
            type,
            disabled,
            checked,
            name
        } = this.props;
        const { groupClassName, ...inputProps } = this.props;
        return (
            <FormGroup
                className={classNames('form-group', [groupClassName], {
                    required: validations.required,
                    'has-error': hasError
                })}>
                {label &&
                    (type !== 'checkbox' && type !== 'radio') && (
                        <label className="control-label">{label}</label>
                    )}
                {(type === 'text' || type === 'number') && (
                    <FormControl
                        bsClass={'form-control input-options-other'}
                        onChange={e => this.onChange(e)}
                        disabled={isReadOnlyMode || Boolean(disabled)}
                        onBlur={onBlur}
                        onKeyDown={onKeyDown}
                        value={value || ''}
                        ref={input => (this.inputWrapper = input)}
                        type={type}
                        data-test-id={this.props['data-test-id']}
                    />
                )}

                {type === 'textarea' && (
                    <FormControl
                        className="form-control input-options-other"
                        disabled={isReadOnlyMode || Boolean(disabled)}
                        value={value || ''}
                        onBlur={onBlur}
                        onKeyDown={onKeyDown}
                        componentClass={type}
                        onChange={e => this.onChange(e)}
                        data-test-id={this.props['data-test-id']}
                    />
                )}

                {type === 'checkbox' && (
                    <Checkbox
                        className={classNames({
                            required: validations.required,
                            'has-error': hasError
                        })}
                        onChange={e => this.onChangeCheckBox(e)}
                        disabled={isReadOnlyMode || Boolean(disabled)}
                        checked={value}
                        data-test-id={this.props['data-test-id']}>
                        {label}
                    </Checkbox>
                )}

                {type === 'radio' && (
                    <Radio
                        name={name}
                        checked={checked}
                        disabled={isReadOnlyMode || Boolean(disabled)}
                        value={value}
                        ref={input => (this.inputWrapper = input)}
                        onChange={isChecked => this.onChangeRadio(isChecked)}
                        label={label}
                        data-test-id={this.props['data-test-id']}
                    />
                )}
                {type === 'select' && (
                    <FormControl
                        onClick={e => this.optionSelect(e)}
                        componentClass={type}
                        name={name}
                        {...inputProps}
                        data-test-id={this.props['data-test-id']}
                    />
                )}
            </FormGroup>
        );
    }

    getValue() {
        return this.props.type !== 'select'
            ? this.state.value
            : this.state.selectedValues;
    }

    getChecked() {
        return this.state.checked;
    }

    optionSelect(e) {
        let selectedValues = [];
        if (e.target.value) {
            selectedValues.push(e.target.value);
        }
        this.setState({
            selectedValues
        });
    }

    onChange(e) {
        let { onChange } = this.props;
        this.setState({
            value: e.target.value
        });
        onChange(e.target.value);
    }

    onChangeCheckBox(e) {
        let { onChange } = this.props;
        this.setState({
            checked: e.target.checked
        });
        onChange(e.target.checked);
    }

    onChangeRadio(isChecked) {
        let { onChange } = this.props;
        this.setState({
            checked: isChecked
        });
        onChange(this.state.value);
    }

    focus() {
        ReactDOM.findDOMNode(this.inputWrapper).focus();
    }
}
export default InputWrapper;