<script>
import formBuilder from '@/utils/formBuilder'
import moment from "moment/moment";
import {deepCopy} from "@/utils";
export default {
  props: {
    readable: {
      type: Array,
      default: () => [],
      required: true
    },
    writeable: {
      type: Array,
      default: () => [],
      required: true
    },
    originalForm: {
      type: Object,
      default: () => ({}),
      required: true
    },
    subForm: {
      type: Map,
      default: () => new Map()
    },
    device: {
      type: String,
      default: 'desktop',
      required: true
    },
    fields: {
      type: Array,
      default: () => [],
      required: true
    },
    fileList: {
      type: Object,
      default: () => ({}),
      required: true
    },
    scriptContent: String

  },
  data() {
    return {
      form: {},
      file: {
        ggg: []
      },
      showControl: {},
      vanCalendarOption: {
        isShow: false,
        forFormName: ""
      },
      vanTimePickerOption: {
        isShow: false,
        forFormName: ""
      },
      vanPopupOption: {
        isShow: false,
        forFormName: "",
        columns: []
      }
    }
  },
  methods: {},
  computed: {},
  watch: {
    info(newVal) {
      let keys = newVal.map(i => i.name)
      keys.forEach(key => {
        this.form[key] = ''
      })
    },
    originalForm(newVal) {
      this.form = deepCopy(newVal)
    },
    fileList(newVal) {
      this.file = deepCopy(newVal)
    },
    scriptContent(newVal) {
      if(newVal) {
        try {
          new Function(newVal).bind(this)()
        } catch (err) {
          console.error(err)
        }
      }
    }
  },
  render(h) {
    const authFields = this.fields.map(field => ({
      ...field,
      _readable: this.readable.indexOf(field.id) !== -1,
      _writeable: this.writeable.indexOf(field.id) !== -1
    }))
    return h('div',[
      h('van-form',{
        props: {
          'scroll-to-error': true
        }
      },authFields.map(field => formBuilder.bind(this)(this.device, field, h))),
      //calendar
      authFields.findIndex(i => i.type === 'date') !== -1 ?
        h('van-calendar',{
          ref: `vanCalendar`,
          props: {
            value: this.vanCalendarOption.isShow,
            'min-date': this.$moment().subtract('years',10).toDate(),
            'max-date': this.$moment().add('years',10).toDate(),
          },
          on: {
            input: e => {
              this.$set(this.vanCalendarOption,'isShow',e)
            },
            confirm: date => {
              this.$set(this.form,this.vanCalendarOption.forFormName,moment(date).format('YYYY-MM-DD'))
              this.$set(this.vanCalendarOption,'isShow',false)
            }
          }
        }) : '',
      //datetimepicker
      authFields.findIndex(i => i.type === 'datetime') !== -1 ?
        h('van-popup',{
          props: {
            value: this.vanTimePickerOption.isShow,
            position: 'bottom',
          },
          on: {
            input: e => {
              this.$set(this.vanTimePickerOption,'isShow',e)
            },
          }
        },[
          h('van-datetime-picker',{
            props: {
              type: 'datetime'
            },
            on: {
              confirm: time => {
                this.$set(this.form,this.vanTimePickerOption.forFormName,moment(time).format('YYYY-MM-DD HH:mm:ss'))

              },
              cancel: _ => {
                this.$set(this.vanTimePickerOption,'isShow',false)
              }
            }
          })
        ]) : '',
      //popup
      authFields.findIndex(i => i.type === 'select') !== -1 ?
        h('van-popup',{
          props: {
            value: this.vanPopupOption.isShow,
            position: 'bottom',
          },
          on: {
            input: e => {
              this.$set(this.vanPopupOption,'isShow',e)
            },
          }
        },[
          h('van-picker',{
            props: {
              'show-toolbar': true,
              columns: this.vanPopupOption.columns,
            },
            on: {
              confirm: value => {
                this.$set(this.form,this.vanPopupOption.forFormName,value)
                this.$set(this.vanPopupOption,'isShow',false)
              },
              cancel: _ => {
                this.$set(this.vanPopupOption,'isShow',false)
              }
            }
          })
        ]) : '',
    ])
  }
}
</script>

<style scoped lang="scss">
</style>
