<template>
    <a-tooltip :title="title" :overlayStyle="{zIndex: 2001}">
        <div class="img-check-box" @click="toggle">
            <img :src="img" />
            <div v-if="sChecked" class="check-item">
                <a-icon type="check" />
            </div>
        </div>
    </a-tooltip>
</template>

<script>
const Group = {
    name: 'ImgCheckboxGroup',
    props: {
        multiple: {
            type: Boolean,
            required: false,
            default: false,
        },
        defaultValues: {
            type: Array,
            required: false,
            default: () => [],
        },
    },
    data() {
        return {
            values: [],
            options: [],
        };
    },
    provide() {
        return {
            groupContext: this,
        };
    },
    watch: {
        values: function (value) {
            this.$emit('change', value);
            // // 此条件是为解决单选时，触发两次chang事件问题
            // if (!(newVal.length === 1 && oldVal.length === 1 && newVal[0] === oldVal[0])) {
            //   this.$emit('change', this.values)
            // }
        },
    },
    methods: {
        handleChange(option) {
            if (!option.checked) {
                if (this.values.indexOf(option.value) > -1) {
                    this.values = this.values.filter((item) => item != option.value);
                }
            } else {
                if (!this.multiple) {
                    this.values = [option.value];
                    this.options.forEach((item) => {
                        if (item.value != option.value) {
                            item.sChecked = false;
                        }
                    });
                } else {
                    this.values.push(option.value);
                }
            }
        },
    },
    render(h) {
        return h(
            'div',
            {
                attrs: { style: 'display: flex' },
            },
            [this.$slots.default],
        );
    },
};

export default {
    name: 'ImgCheckbox',
    Group,
    props: {
        checked: {
            type: Boolean,
            required: false,
            default: false,
        },
        img: {
            type: String,
            required: true,
        },
        value: {
            required: true,
        },
        title: String,
    },
    data() {
        return {
            sChecked: this.initChecked(),
        };
    },
    inject: ['groupContext'],
    watch: {
        sChecked: function () {
            const option = {
                value: this.value,
                checked: this.sChecked,
            };
            this.$emit('change', option);
            const groupContext = this.groupContext;
            if (groupContext) {
                groupContext.handleChange(option);
            }
        },
    },
    created() {
        const groupContext = this.groupContext;
        if (groupContext) {
            this.sChecked =
                groupContext.defaultValues.length > 0
                    ? groupContext.defaultValues.indexOf(this.value) >= 0
                    : this.sChecked;
            groupContext.options.push(this);
        }
    },
    methods: {
        toggle() {
            if (this.groupContext.multiple || !this.sChecked) {
                this.sChecked = !this.sChecked;
            }
        },
        initChecked() {
            let groupContext = this.groupContext;
            if (!groupContext) {
                return this.checked;
            } else if (groupContext.multiple) {
                return groupContext.defaultValues.indexOf(this.value) > -1;
            } else {
                return groupContext.defaultValues[0] == this.value;
            }
        },
    },
};
</script>

<style lang="less" scoped>
.img-check-box {
    margin-right: 16px;
    position: relative;
    border-radius: 4px;
    cursor: pointer;
    .check-item {
        position: absolute;
        top: 0;
        right: 0;
        width: 100%;
        padding-top: 15px;
        padding-left: 24px;
        height: 100%;
        color: @primary-color;
        font-size: 14px;
        font-weight: bold;
    }
}
</style>
