<template>
    <view v-if="show" class="u-badge" :class="[
            isDot ? 'u-badge-dot' : '', 
            size == 'mini' ? 'u-badge-mini' : '',
            type ? 'u-badge--bg--' + type : ''
        ]" :style="[{
            top: offset[0] + 'rpx',
            right: offset[1] + 'rpx',
            fontSize: fontSize + 'rpx',
            position: absolute ? 'absolute' : 'static',
            color: color,
            backgroundColor: bgColor
        }, boxStyle]"
    >
        {{showText}}
    </view>
</template>

<script>
    /**
     * badge 角标
     * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
     * @tutorial https://www.uviewui.com/components/badge.html
     * @property {String Number} count 展示的数字,大于 overflowCount 时显示为 ${overflowCount}+,为0且show-zero为false时隐藏
     * @property {Boolean} is-dot 不展示数字,只有一个小点(默认false)
     * @property {Boolean} absolute 组件是否绝对定位,为true时,offset参数才有效(默认true)
     * @property {String Number} overflow-count 展示封顶的数字值(默认99)
     * @property {String} type 使用预设的背景颜色(默认error)
     * @property {Boolean} show-zero 当数值为 0 时,是否展示 Badge(默认false)
     * @property {String} size Badge的尺寸,设为mini会得到小一号的Badge(默认default)
     * @property {Array} offset 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,单位rpx。absolute为true时有效(默认[20, 20])
     * @property {String} color 字体颜色(默认#ffffff)
     * @property {String} bgColor 背景颜色,优先级比type高,如设置,type参数会失效
     * @property {Boolean} is-center 组件中心点是否和父组件右上角重合,优先级比offset高,如设置,offset参数会失效(默认false)
     * @example <u-badge type="error" count="7"></u-badge>
     */
    export default {
        name: 'u-badge',
        props: {
            // primary,warning,success,error,info
            type: {
                type: String,
                default: 'error'
            },
            // default, mini
            size: {
                type: String,
                default: 'default'
            },
            //是否是圆点
            isDot: {
                type: Boolean,
                default: false
            },
            // 显示的数值内容
            count: {
                type: [Number, String],
            },
            // 展示封顶的数字值
            overflowCount: {
                type: Number,
                default: 99
            },
            // 当数值为 0 时,是否展示 Badge
            showZero: {
                type: Boolean,
                default: false
            },
            // 位置偏移
            offset: {
                type: Array,
                default: () => {
                    return [20, 20]
                }
            },
            // 是否开启绝对定位,开启了offset才会起作用
            absolute: {
                type: Boolean,
                default: true
            },
            // 字体大小
            fontSize: {
                type: [String, Number],
                default: '24'
            },
            // 字体演示
            color: {
                type: String,
                default: '#ffffff'
            },
            // badge的背景颜色
            bgColor: {
                type: String,
                default: ''
            },
            // 是否让badge组件的中心点和父组件右上角重合,配置的话,offset将会失效
            isCenter: {
                type: Boolean,
                default: false
            }
        },
        computed: {
            // 是否将badge中心与父组件右上角重合
            boxStyle() {
                let style = {};
                if(this.isCenter) {
                    style.top = 0;
                    style.right = 0;
                    // Y轴-50%,意味着badge向上移动了badge自身高度一半,X轴50%,意味着向右移动了自身宽度一半
                    style.transform = "translateY(-50%) translateX(50%)";
                } else {
                    style.top = this.offset[0] + 'rpx';
                    style.right = this.offset[1] + 'rpx';
                    style.transform = "translateY(0) translateX(0)";
                }
                // 如果尺寸为mini,后接上scal()
                if(this.size == 'mini') {
                    style.transform = style.transform + " scale(0.8)";
                }
                return style;
            },
            // isDot类型时,不显示文字
            showText() {
                if(this.isDot) return '';
                else {
                    if(this.count > this.overflowCount) return `${this.overflowCount}+`;
                    else return this.count;
                }
            },
            // 是否显示组件
            show() {
                // 如果count的值为0,并且showZero设置为false,不显示组件
                if(this.count == 0 && this.showZero == false) return false;
                else return true;
            }
        }
    }
</script>

<style lang="scss" scoped>
    @import "../../libs/css/style.components.scss";
    
    .u-badge {
        /* #ifndef APP-NVUE */
        display: inline-flex;
        /* #endif */
        justify-content: center;
        align-items: center;
        line-height: 24rpx;
        padding: 4rpx 8rpx;
        border-radius: 100rpx;
        z-index: 9;
        
        &--bg--primary {
            background-color: $u-type-primary;
        }
        
        &--bg--error {
            background-color: $u-type-error;
        }
        
        &--bg--success {
            background-color: $u-type-success;
        }
        
        &--bg--info {
            background-color: $u-type-info;
        }
        
        &--bg--warning {
            background-color: $u-type-warning;
        }
    }
    
    .u-badge-dot {
        height: 16rpx;
        width: 16rpx;
        border-radius: 100rpx;
        line-height: 1;
    }
    
    .u-badge-mini {
        transform: scale(0.8);
        transform-origin: center center;
    }
    
    // .u-primary {
    //     background: $u-type-primary;
    //     color: #fff;
    // }
    
    // .u-error {
    //     background: $u-type-error;
    //     color: #fff;
    // }
    
    // .u-warning {
    //     background: $u-type-warning;
    //     color: #fff;
    // }
    
    // .u-success {
    //     background: $u-type-success;
    //     color: #fff;
    // }
    
    // .u-black {
    //     background: #585858;
    //     color: #fff;
    // }
    
    .u-info {
        background-color: $u-type-info;
        color: #fff;
    }
</style>