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

/**
 * 图片列表组件<br/>
 * - 通过images配置图片列表数据,数组格式,其中图片地址对应`image`字段,名称对应`title`字段,描述对应`desp`字段。
 * - 通过column设置图片列表的列数,1-8列。
 * - 通过titleField设置名称的格式,以`#`代表名称;通过despField设置描述的格式,以`#`代表描述。
 * - 通过otherParams设置额外的字段和格式。
 * - 通过clickCallback设置点击单个图片块的回调函数,返回当前图片的所有数据。
 * - 可以自定义内容children,当有内容时除了column其他属性不起作用。
 *
 * 主要属性和接口:
 * - images:图片列表数据,默认[]。<br>
 * ```code
 * json:
 * {
 *  "data": [
 *      {
 *          "image": "http://img5.duitang.com/uploads/item/201602/11/20160211214958_RhdCY.jpeg",
 *          "title": "图1",
 *          "desp": "关于图是一个...",
 *          "score": 1
 *      },
 *      ...
 *  ]
 * }
 * ...
 * <ImageList images={this.state.images} />
 * ```
 * - column:列表的列数,默认1。<br>
 * 如: `<ImageList column={2}  images={this.state.images} />`
 * - titleField:名称的格式,以`#`代表名称,默认"#"despField:描述的格式,以`#`代表描述,默认"#"。<br>
 * 如: `<ImageList images={this.state.images} titleField={"姓名: #"} despField={"描述: #"} />`
 * - otherParams:额外的字段和格式,默认{}。<br>
 * 如: `<ImageList images={this.state.images} otherParams={{"score":"分数: #"}} />`
 * - clickCallback:点击单个图片块的回调函数。<br>
 * 如: `<ImageList images={this.state.images} clickCallback={(data)=>{console.log(data);}} />`
 * - 自定义内容:children,当有内容时除了column其他属性不起作用。
 * ```code
 * <ImageList column={4}>
 *  {
 *      this.state.images.map((data,index)=>{
 *          return (
 *              <dl key={index}>
 *                  <dd>
 *                      <p>{data.title}</p>
 *                      <p>{data.desp}</p>
 *                  </dd>
 *                  <dt>
 *                      <img src={data.image} alt={data.title} />
 *                  </dt>
 *              </dl>
 *          )
 *      })
 *  }
 * </ImageList>
 * ```
 * 
 * @class ImageList
 * @module 操作类组件
 * @extends Component
 * @constructor
 * @since 1.7.0
 * @demo imagelist|image-list.js {展示}
 * @show true
 * */

export default class ImageList extends Component{
    static propTypes = {
        /**
         * 样式前缀
         * @property classPrefix
         * @type String
         * @default 'image-list'
         * */
        classPrefix: PropTypes.string,
         /**
         * 图片列表数据
         * @property images
         * @type Array
         * @default []
         * */
        images: PropTypes.array,
        /**
         * 图片列数
         * @property column
         * @type Number
         * @default 1
         * */
        column: PropTypes.number,
        /**
         * 名称格式
         * @property titleField
         * @type String
         * @default "#"
         * */
        titleField: PropTypes.string,
        /**
         * 描述格式
         * @property despField
         * @type String
         * @default "#"
         * */
        despField: PropTypes.string,
         /**
         * 其他参数,额外增加的可自定义的字段
         * @property otherParams
         * @type Object
         * @default {}
         * */
        otherParams: PropTypes.object,
        /**
         * 点击单个图片块的回调函数,返回当前图片的所有信息
         * @method clickCallback
         * @type Function
         * @default null
         **/
        clickCallback: PropTypes.func
    };

    static defaultProps ={
        images: [],
        column: 1,
        titleField: "#",
        despField: "#",
        otherParams: {},
        classPrefix:'image-list',
        classMapping : {}
    };

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

    formatParams(format, param){
        if(param && format.indexOf('#')!=-1){
            return format.replace('#',param);
        }
    }

    clickCallback(data){
        let {clickCallback} = this.props;
        if(clickCallback) clickCallback(data);
    }

    renderImageList(){
        let {images, column, titleField, despField, otherParams, className, children} = this.props;

        if(children){
            return <div className={classnames(this.getProperty(true), className, setPhoenixPrefix("column-"+column))}>{children}</div>
        }else{
            return (
                <div className={classnames(this.getProperty(true), className, setPhoenixPrefix("column-"+column))}>
                    {
                        images.map((data,index)=>{
                            return (
                                <dl key={index} onClick={::this.clickCallback.bind(this,data)}>
                                    <dt>
                                        <img src={data.image} alt={data.title} />
                                    </dt>
                                    <dd>
                                        <p className={setPhoenixPrefix('image-title')}>{this.formatParams(titleField, data.title)}</p>
                                        <p className={setPhoenixPrefix('image-desp')}>{this.formatParams(despField, data.desp)}</p>
                                        {this.renderRest(otherParams, data)}
                                    </dd>
                                </dl>
                            )
                        })
                    }
                </div>
            );
        }
    }

    renderRest(otherParams, data){
        var newRest = [];

        for(let i in otherParams){
            newRest.push(<p key={i}>{this.formatParams(otherParams[i], data[i])}</p>);
        }

        return newRest;
    }

    render(){
        return this.renderImageList();
    }
}