<template>
  <div :class="`${prefixCls}`">
    <Radio v-for="item in options" :key="item.value" :checked="item.value === stateValue"
      :value="item.value" :disabled="item.disabled" @change="handleChange">{{item.label}}</Radio>
    <slot v-if="options.length === 0"></slot>
  </div>
</template>
<script>
import Radio from './Radio.vue'
export default {
  name: 'RadioGroup',
  props: {
    prefixCls: {
      default: 'ant-radio-group',
      type: String,
    },
    defaultValue: {
      default: undefined,
      type: [String, Number],
    },
    value: {
      default: undefined,
      type: [String, Number],
    },
    size: {
      default: 'default',
      validator (value) {
        return ['large', 'default', 'small'].includes(value)
      },
    },
    options: {
      default: () => [],
      type: Array,
    },
  },
  data () {
    const { value, defaultValue } = this
    return {
      stateValue: value || defaultValue,
    }
  },
  model: {
    prop: 'value',
  },
  computed: {

  },
  created () {
    this.setChildRadio(this.$slots.default)
  },
  methods: {
    handleChange (event) {
      if (this.disabled) {
        return false
      }
      const target = event.target
      const { value: targetValue } = target
      if (this.value === undefined) {
        this.stateValue = targetValue
      }
      this.$emit('input', targetValue)
      this.$emit('change', targetValue)
    },
    setChildRadio (children = []) {
      const { options, $slots, stateValue } = this
      if (options.length === 0 && $slots.default) {
        children.forEach(({ componentOptions = {}, children: newChildren }) => {
          const { Ctor, propsData } = componentOptions
          if (Ctor && Ctor.options.name === 'Radio') {
            propsData.isGroup = true
            propsData.onGroupChange = this.handleChange
            propsData.checked = propsData.value === stateValue
          } else {
            this.setChildRadio(newChildren)
          }
        }, this)
      }
    },
  },
  beforeUpdate () {
    this.setChildRadio(this.$slots.default)
  },
  watch: {
    value (val) {
      this.stateValue = val
      this.setChildRadio(this.$slots.default)
    },
  },
  components: {
    Radio,
  },
}
</script>