import { Vue, Component, Prop, Emit } from 'vue-property-decorator';
import './upload-file.less';

@Component({})
export default class UploadFile extends Vue {

    /**
     * 上传路径
     * @type {any}
     * @memberof UploadFile
     */
    public url: string = '//jsonplaceholder.typicode.com/posts/';

    /**
     * 设置上传的请求头部
     * @type {Object}
     * @memberof UploadFile
     */
    @Prop() public headers?: Object;

    /**
     * 是否支持多选文件
     * @type {boolean}
     * @memberof UploadFile
     */
    @Prop() public multiple?: boolean;

    /**
     * 是否支持粘贴上传文件
     * @type {boolean}
     * @memberof UploadFile 
     */
    @Prop() public paste?: boolean;

    /**
     * 是否禁用
     * @type {boolean}
     * @memberof UploadFile 
     */
    @Prop() public disabled?: boolean;

    /**
     * 上传时附带的额外参数
     * @type {any}
     * @memberof UploadFile 
     */
    @Prop() public data?: any;

    /**
     * 上传控件的类型,可选值为 select(点击选择),drag(支持拖拽)
     * @type {any}
     * @memberof UploadFile 
     */
    @Prop() public type?: any;

    /**
     * 是否显示已上传文件列表
     * @type {boolean}
     * @memberof UploadFile
     */
    @Prop() public showuploadlist?: boolean;

    /**
     * 接受上传的文件类型
     * @type {string}
     * @memberof UploadFile
     */
    @Prop() public accept?: string;

    /**
     * 支持的文件类型,与 accept 不同的是,format 是识别文件的后缀名,accept 为 input 标签原生的 accept 属性,
     * 会在选择文件时过滤,可以两者结合使用
     * @type {Array<any>}
     * @memberof UploadFile
     */
    @Prop() public format?: Array<any>;

    /**
     * 文件大小限制,单位 kb
     * @type {number}
     * @memberof UploadFile
     */
    @Prop() public maxsize?: number;

    /**
     * 上传文件之前的钩子,参数为上传的文件,若返回 false 或者 Promise 则停止上传
     */
    @Emit()
    public beforeupload(file:any) {
        console.log('beforeupload---------'+file);
    }

    /**
     * 文件上传成功时的钩子,返回字段为 response, file, fileList
     */
    @Emit()
    public success(response: any, file: any, fileList: any) {
        console.log('success---------' + file);
    }

    /**
     * 文件上传时的钩子,返回字段为 event, file, fileList
     */
    @Emit()
    public progress(event: any, file: any, fileList: any) {
        console.log('progress---------' + file);
    }

    /**
     * 文件上传失败时的钩子,返回字段为 error, file, fileList
     */
    @Emit()
    public error(error: any, file: any, fileList: any) {
        console.log('error---------' + file);
    }

    /**
     * 文件列表移除文件时的钩子,返回字段为 file, fileList
     */
    @Emit()
    public remove(file: any, fileList: any) {
        console.log('remove---------' + file);
    }

    /**
     * 文件格式验证失败时的钩子,返回字段为 file, fileList
     */
    @Emit()
    public formaterror(file: any, fileList: any) {
        console.log('formaterror---------' + file);
    }

    /**
     * 文件超出指定大小限制时的钩子,返回字段为 file, fileList
     */
    @Emit()
    public exceededsize(file: any, fileList: any) {
        console.log('exceededsize---------' + file);
    }

    public render() {
        return (<div class="upload-file">
            <upload action={this.url} headers={this.headers ? this.headers : null}
                multiple={this.multiple === true ? true : false} paste={this.paste === false ? false : true}
                disabled={this.disabled === true ? true : false} data={this.data ? this.data : null}
                type={this.type === 'select' ? 'select' : 'drag'} show-upload-list={this.showuploadlist === true ? true : false}
                accept={this.accept ? this.accept : null} format={this.format ? this.format : []}
                maxsize={this.maxsize ? this.maxsize : null} on-before-upload={this.beforeupload} on-success={this.success}
                on-error={this.error} on-remove={this.remove} on-format-error={this.formaterror}
                on-exceeded-size={this.exceededsize} on-progress={this.progress}>
                <div class="upload-text">
                    <p>将图片拖到这里替换</p>
                    <p><span class="text-style">本地上传</span>或<span class="text-style">从素材库选择</span></p>
                </div>
            </upload>
        </div>);
    }
}