import React,{PropTypes} from 'react';
import Component from './utils/Component';
import classnames from 'classnames';
import {setPhoenixPrefix} from './utils/Tool';

/**
 * input框组件<br/>
 * - 使用方式跟原生一致, 支持disabled。
 * - 通过type设置input的类型, 可选text,checkbox,radio。
 * - 当类型为text时, 可通过defaultValue设置默认值; 可通过value和onChange事件配合使用手动设置输入值。
 * - 当类型为checkbox&radio时, 可通过label设置展示的文字。
 * - 当类型为checkbox&radio时, 可通过defaultChecked设置默认值; 可通过checked和onChange事件配合使用手动设置输入值。
 *
 * 主要属性和接口:
 * - type:input类型, 默认text <br/>
 * 如:`<Input type="checkbox" />`
 * - defaultValue:默认值(text) <br/>
 * 如:`<Input type="text" defaultValue="测试" />`
 * - value&onChange:(text)<br/>
 * 如:`<Input type="text" value={this.state.value} onChange={()=>{this.setState({value:"测试"})}} />`
 * - label:展示的文字信息(checkbox&radio), 默认空<br/>
 * 如:`<Input type="checkbox" label="测试" />`
 * - defaultChecked:默认值(checkbox&radio)<br/>
 * 如:`<Input type="checkbox" defaultChecked={true} />`
 * - checked&onChange:(checkbox&radio)<br/>
 * 如:`<Input type="checkbox" checked={this.state.checked} onChange={()=>{this.setState({checked:false})}} />`
 *
 * @class Input
 * @module 表单组件
 * @extends Component
 * @constructor
 * @since 0.1.0
 * @demo input|input.js {展示}
 * @show true
 * */

export default class Input extends Component{

    static propTypes = {
        /**
         * input类型, 可选[text,checkbox,radio], 默认text
         * @property type
         * @type String
         * @default 'text'
         * */
        type: PropTypes.string,
        /**
         * 类型为checkbox&radio时, 展示的文字信息
         * @property label
         * @type String
         * @default ''
         * */
        label: PropTypes.string,
        /**
         * 样式前缀
         * @property classPrefix
         * @type String
         * @default 'input'
         * */
        classPrefix:PropTypes.string,
        /**
         * 标签tagName
         * @property componentTag
         * @type String
         * */
        componentTag:PropTypes.string,
        /**
         * 更改值时触发的回调
         * @event onChange
         * @type Function
         * */
        onChange: PropTypes.func
    };

    static defaultProps = {
        type: 'text',
        classPrefix:'input',
        componentTag:'div',
        classMapping : {}
    };

    constructor(props, context) {
        super(props, context);
    }

    otherView(type){
        return (
            <label className={setPhoenixPrefix("multi-group")}>
                <div className={setPhoenixPrefix(type)}>
                    <input {...this.props} />
                    <i></i>
                </div>
                <span>{this.props.label ||''}</span>
            </label>
        );
    }

    renderInput(type){
        let html = <div></div>;

        if(type =='checkbox' || type=='radio'){
            html=this.otherView(type);
        }else{
            html = (<input {...this.props} className={
                classnames(
                    this.getProperty(true),
                    this.props.className
                )
                }/>);
        }

        return html;
    }


    render(){
        let {componentTag:Component,type} = this.props;
        return this.renderInput(type ? type:'text');
    }

}