<template>
    <div class="app-rate">
        <el-rate
            :value="currentVal"
            :disabled="disabled || readonly"
            :max="maxItem"
            :colors="colors"
            :show-text="showText"
            :texts="texts"
            @change="change"
        >
        </el-rate>
    </div>
</template>

<script lang="ts">
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
import { CodeListService, LogUtil } from "ibiz-core";

@Component({})
export default class AppRate extends Vue {
    /**
     * 传入值
     * @type {any}
     * @memberof AppRate
     */
    @Prop() public value?: any;

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

    /**
     * 只读模式
     *
     * @type {boolean}
     */
    @Prop({ default: false }) public readonly?: boolean;

    /**
     * 下发数据
     * @type {number}
     * @memberof AppRate
     */
    @Prop() public data?: any;

    /**
     * 代码表服务对象
     *
     * @type {CodeListService}
     * @memberof AppRate
     */
    public codeListService: CodeListService = new CodeListService({
        $store: this.$store,
    });

    /**
     * 传递最大值
     * @type {*}
     * @memberof AppRate
     */
    @Prop({ default: 5 }) public max!: number;

    /**
     * 应用上下文
     * @type {*}
     * @memberof AppRate
     */
    @Prop() context: any;

    /**
     * 视图参数
     * @type {*}
     * @memberof AppRate
     */
    @Prop() viewparams: any;

    /**
     * 临时上下文
     * @type {*}
     * @memberof AppRate
     */
    @Prop() localContext: any;

    /**
     * 临时参数
     * @type {*}
     * @memberof AppRate
     */
    @Prop() localParam: any;

    /**
     * 代码表标识
     * @type {string}
     * @memberof AppRate
     */
    @Prop() tag?: string;

    /**
     * 代码表类型
     * @type {string}
     * @memberof AppRate
     */
    @Prop() codelistType?: string;

    /**
     * 代码表
     *
     * @type {string}
     * @memberof AppRate
     */
    @Prop() public codeList!: any;

    /**
     * 代码表值分隔符
     * @type {string}
     * @memberof AppRate
     */
    @Prop({ default: "," }) valueSeparator?: string;

    /**
     * 数据名称
     * @type {*}
     * @memberof AppRate
     */
    @Prop() name: any;

    /**
     * 辅助说明文本
     * @type {*}
     * @memberof AppRate
     */
    @Prop() texts?: any[];

    /**
     * 是否显示辅助说明文本
     * @type {boolean}
     * @memberof AppRate
     */
    @Prop() showText?: boolean;

    /**
     * 自定义颜色
     * @type {*}
     * @memberof AppRate
     */
    @Prop() colors?: Object | string[3];

    /**
     * 最大值
     * @type {number}
     * @memberof AppRate
     */
    public maxItem: number = 5;

    /**
     * 监听数据变化
     *
     * @memberof AppRate
     */
    @Watch("data", { immediate: true, deep: true })
    onDataChange(newVal: any, oldVal: any) {
        if (newVal) {
            if (this.tag && this.codelistType == "DYNAMIC") {
                // 公共参数处理
                let data: any = {};
                this.handlePublicParams(data);
                // 参数处理
                let _context = data.context;
                let _param = data.param;
                this.codeListService
                    .getItems(this.tag, _context, _param)
                    .then((res: any) => {
                        const items = res;
                        //  获取最大值
                        const maxItem = Math.max.apply(
                            Math,
                            items.map((item: any) => {
                                return item.value;
                            })
                        );
                        this.maxItem = maxItem > 5 ? 5 : maxItem;
                    })
                    .catch((error: any) => {
                        LogUtil.log(
                            `----${this.tag}----$t('app.commonwords.codenotexist')`
                        );
                    });
            }
        }
    }

    /**
     * 当前值
     *
     * @memberof AppRate
     */
    get currentVal() {
        return Number(this.value);
    }

    /**
     * change
     * @memberof AppRate
     */
    public change(val: any) {
        this.$emit("change", val);
    }

    /**
     * Vue生命周期
     * @memberof AppRate
     */
    public created() {
        if (this.max) {
            this.maxItem = this.max;
        }
        this.loadData();
    }

    /**
     * 公共参数处理
     *
     * @param {*} arg
     * @returns
     * @memberof AppRate
     */
    public handlePublicParams(arg: any) {
        // 合并表单参数
        arg.param = this.viewparams
            ? JSON.parse(JSON.stringify(this.viewparams))
            : {};
        arg.context = this.context
            ? JSON.parse(JSON.stringify(this.context))
            : {};
        // 附加参数处理
        if (this.localContext && Object.keys(this.localContext).length > 0) {
            let _context = this.$util.computedNavData(
                this.data,
                arg.context,
                arg.param,
                this.localContext
            );
            Object.assign(arg.context, _context);
        }
        if (this.localParam && Object.keys(this.localParam).length > 0) {
            let _param = this.$util.computedNavData(
                this.data,
                arg.param,
                arg.param,
                this.localParam
            );
            Object.assign(arg.param, _param);
        }
    }

    /**
     * 加载数据
     *
     * @memberof DropDownList
     */
    public loadData() {
        if (this.tag && this.codelistType) {
            let data: any = {};
            this.handlePublicParams(data);
            // 参数处理
            let context = data.context;
            let viewparam = data.param;
            this.codeListService
                .getDataItems({
                    tag: this.tag,
                    type: this.codelistType,
                    data: this.codeList,
                    context: context,
                    viewparam: viewparam,
                })
                .then((codelistItems: Array<any>) => {
                    const items = codelistItems;
                    //  获取最大值
                    const maxItem = Math.max.apply(
                        Math,
                        items.map((item: any) => {
                            return item.value;
                        })
                    );
                    this.maxItem = maxItem > 5 ? 5 : maxItem;
                })
                .catch((error: any) => {
                    LogUtil.log(
                        `----${this.tag}----${this.$t(
                            "app.commonwords.codenotexist"
                        )}`
                    );
                });
        }
    }
}
</script>