<template>
  <view
    class="ui-radio ss-flex ss-col-center"
    @tap="onRaido"
    :class="[{ disabled: disabled }, { img: src }, ui]"
    :style="[customStyle]"
  >
    <slot name="leftLabel"></slot>
    <view
      v-if="!none"
      class="ui-radio-input"
      :class="[isChecked ? 'cur ' + bg : unbg, src ? 'radius' : 'round']"
    ></view>
    <image class="ui-radio-img radius" v-if="src" :src="src" mode="aspectFill"></image>
    <view class="ui-radio-content" v-else>
      <slot>
        <view class="ui-label-text" :style="[labelStyle]">{{ label }}</view>
      </slot>
    </view>
    <view
      v-if="ui.includes('card')"
      class="ui-radio-bg round"
      :class="[isChecked ? 'cur ' + bg : '']"
    ></view>
  </view>
</template>

<script setup>
  /**
   * 单选 - radio
   *
   *
   * property {Object} customStyle 												- 自定义样式
   * property {String} ui 														- radio样式Class
   * property {String} modelValue													- 绑定值
   * property {Boolean} disabled													- 是否禁用
   * property {String} bg															- 选中时背景Class
   * property {String} unbg														- 未选中时背景Class
   * property {String} src														- 图片选中radio
   * property {String} label														- label文本
   * property {Boolean} none														- 是否隐藏raido按钮
   *
   * @slot default																- 自定义label样式
   * @event {Function} change														- change事件
   *
   */
  import { computed, reactive, watchPostEffect, getCurrentInstance } from 'vue';
  const vm = getCurrentInstance();

  // 组件数据
  const state = reactive({
    currentValue: false,
  });

  // 定义事件
  const emits = defineEmits(['change', 'update:modelValue']);

  // 接收参数
  const props = defineProps({
    customStyle: {
      type: Object,
      default: () => ({}),
    },
    ui: {
      type: String,
      default: 'check', //check line
    },
    modelValue: {
      type: [String, Number, Boolean],
      default: false,
    },
    disabled: {
      type: Boolean,
      default: false,
    },
    bg: {
      type: String,
      default: 'ui-BG-Main',
    },
    unbg: {
      type: String,
      default: 'borderss',
    },
    src: {
      type: String,
      default: '',
    },
    label: {
      type: String,
      default: '',
    },
    labelStyle: {
      type: Object,
      default: () => ({}),
    },
    none: {
      type: Boolean,
      default: false,
    },
  });

  watchPostEffect(() => {
    state.currentValue = props.modelValue;
    emits('update:modelValue', state.currentValue);
  });

  // 是否选中
  const isChecked = computed(() => state.currentValue);

  // 点击
  const onRaido = () => {
    if (props.disabled) return;
    state.currentValue = !state.currentValue;
    emits('update:modelValue', state.currentValue);
    emits('change', {
      label: props.label,
      value: state.currentValue,
    });
  };
</script>

<style lang="scss" scoped>
  .ui-radio {
    display: flex;
    align-items: center;
    margin: 0 0.5em 0 0;
    height: 18px;
    .ui-radio-input {
      margin: 0 0.5em 0 0;
      display: inline-block;
      width: 18px;
      height: 18px;
      vertical-align: middle;
      line-height: 18px;

      &::before {
        content: '';
        position: absolute;
        width: 0;
        height: 0;
        background-color: currentColor;
        border-radius: 18px;
        @include position-center;
      }
    }

    .ui-radio-input.cur {
      position: relative;

      &::before {
        width: 10px;
        height: 10px;
        transition: $transition-base;
      }
    }

    &:last-child {
      margin: 0 0.14286em;
    }

    &.check {
      .ui-radio-input {
        &::before {
          font-family: 'colorui';
          content: '\e69f';
          width: 18px;
          height: 18px;
          font-size: 0;
          background-color: transparent;
        }
      }

      .ui-radio-input.cur {
        &::before {
          width: 18px;
          height: 18px;
          font-size: 1em;
          transform: scale(0.8);
          text-align: center;
          line-height: 18px;
        }
      }
    }

    &.line {
      .ui-radio-input.cur {
        &::before {
          width: calc(100% - 2px);
          height: calc(100% - 2px);
          background-color: var(--ui-BG);
        }

        &::after {
          content: '';
          position: absolute;
          width: 10px;
          height: 10px;
          background-color: inherit;
          border-radius: 50%;
          @include position-center;
        }
      }
    }

    &.lg {
      .ui-radio-input {
        font-size: 18px;
      }
    }

    &.img {
      position: relative;
      margin: 0 0.28572em 0;

      .ui-radio-input {
        width: 42px;
        height: 42px;
        border-radius: 0px;
        position: absolute;
        margin: 0;
        left: -1px;
        top: -1px;

        &::before {
          width: 40px;
          height: 40px;
          border-radius: $radius;
        }

        &.cur {
          width: 44px;
          height: 44px;
          top: -2px;
          left: -2px;
          border-radius: 7px !important;
          opacity: 0.8;
        }
      }

      .ui-radio-img {
        width: 40px;
        height: 40px;
        display: block;
        overflow: hidden;
        border-radius: 10px;
      }
    }

    &.card {
      display: flex;
      margin: 30rpx;
      padding: 30rpx;
      position: relative;
      border-radius: $radius !important;
      flex-direction: row-reverse;
      justify-content: space-between;

      .ui-radio-bg {
        content: '';
        position: absolute;
        width: 200%;
        height: 200%;
        transform: scale(0.5);
        border-radius: #{$radius * 2} !important;
        z-index: 0;
        left: 0;
        top: 0;
        transform-origin: 0 0;
        background-color: var(--ui-BG);
      }

      .ui-radio-input {
        position: relative;
        z-index: 1;
        margin-right: 0;
      }

      .ui-radio-bg::after {
        content: '';
        position: absolute;
        width: calc(200% - 16px);
        height: calc(200% - 16px);
        transform: scale(0.5);
        transform-origin: 0 0;
        background-color: var(--ui-BG) !important;
        left: 4px;
        top: 4px;
        border-radius: #{$radius * 2 + 8} !important;
        z-index: 0;
      }

      .ui-radio-content {
        position: relative;
        z-index: 1;
        display: flex;
        align-items: center;
        flex: 1;
      }
    }
  }
</style>