<template>
  <el-form-item
    :label="!hiddenLabel && item.label ? item.label : ''"
    :prop="item.prop"
    :rules="item.rules"
    :label-width="item.labelWidth ? `${item.labelWidth}px` : ''"
    :style="item.style || {}"
  >
    <vw-switch-bgc
      v-if="item.type === 'switch-bgc'"
      v-model="form[item.prop]"
    ></vw-switch-bgc>

    <!-- 输入框 -->
    <el-input
      v-if="item.type === 'input'"
      v-model="form[item.prop]"
      :readonly="item.readonly"
      :disabled="item.disabled"
      :placeholder="
        item.placeholder || ` ${item.label ? '请输入' + item.label : ''}`
      "
      @focus="item.focus ? item.focus($event) : {}"
      @change="item.change ? item.change($event) : {}"
      @blur="item.blur ? item.blur($event) : {}"
      :clearable="item.notClearable ? false : true"
      :maxlength="item.maxlength || item.fieldLength"
    >
      <template slot="append" v-if="item.append">{{ item.append }}</template>
      <template slot="prepend" v-if="item.preappend">{{
        item.preappend
      }}</template>
    </el-input>

    <!-- 密码框 -->

    <el-input
      v-if="item.type === 'password'"
      v-model="form[item.prop]"
      type="password"
      :placeholder="item.placeholder || `请输入 ${item.label || ''}`"
      :readonly="item.readonly"
      :disabled="item.disabled"
      @focus="item.focus ? item.focus($event) : {}"
      @change="item.change ? item.change($event) : {}"
      @blur="item.blur ? item.blur($event) : {}"
      :show-password="item.showPassword"
      clearable
      :maxlength="item.maxlength || item.fieldLength"
    >
      <template slot="append" v-if="item.append">{{ item.append }}</template>
      <template slot="prepend" v-if="item.preappend">{{
        item.preappend
      }}</template>
    </el-input>

    <!-- 文本域 -->
    <template v-if="item.type === 'textarea'">
      <el-input
        type="textarea"
        :placeholder="item.placeholder || `请输入 ${item.label || ''}`"
        :autosize="{ minRows: item.minRows, maxRows: item.maxRows }"
        v-model="form[item.prop]"
        :minlength="item.minlength"
        :disabled="item.disabled"
        :maxlength="item.maxlength || item.fieldLength"
        :show-word-limit="item.showWordLimit"
      ></el-input>
    </template>

    <!-- 计数器 -->
    <div v-if="item.type === 'number'" style="display: inline-table">
      <el-input-number
        v-model="form[item.prop]"
        :readonly="item.readonly"
        :disabled="item.disabled"
        :controls="item.controls ? true : false"
        :controls-position="item.controlsPosition"
        :placeholder="item.placeholder"
        :step="item.step"
        @blur="item.blur ? item.blur($event) : {}"
        :precision="item.precision"
        :min="item.minRows"
        :max="item.maxRows"
        style="display: table-cell"
      >
      </el-input-number>
      <span
        v-if="item.append"
        class="el-input-group__append"
        style="line-height: 28px"
        >{{ item.append }}</span
      >
    </div>

    <!-- 单选框 -->
    <el-radio-group
      v-if="item.type === 'radio'"
      v-model="form[item.prop]"
      :disabled="item.disabled"
    >
      <el-radio
        v-for="(opt, optIndex) in item.dicData"
        :key="optIndex"
        :label="opt.value"
        >{{ opt.label }}
      </el-radio>
    </el-radio-group>

    <!-- 多选框 -->
    <template v-if="item.type === 'checkbox'">
      <el-checkbox-group
        v-model="form[item.prop]"
        :disabled="item.disabled"
        @change="checkboxRepel($event)"
      >
        <el-checkbox
          v-for="(opt, optIndex) in item.dicData"
          :key="optIndex"
          :label="opt.value"
          >{{ opt.label }}
        </el-checkbox>
      </el-checkbox-group>
    </template>

    <!-- 下拉框 -->
    <template v-if="item.type === 'select'">
      <el-select
        :clearable="item.clearable"
        :filterable="item.filterable"
        :disabled="item.disabled"
        v-model="form[item.prop]"
        :placeholder="
          item.placeholder ? item.placeholder : `请选择 ${item.label || ''}`
        "
        default-first-option
        :multiple="item.multiple"
        :multiple-limit="item.limit"
      >
        <el-option
          v-for="(opt, optIndex) in item.dicData"
          :key="optIndex"
          :label="opt.label"
          :value="opt.value"
        >
        </el-option>
      </el-select>
    </template>
    <!-- 级联 -->
    <el-cascader
      v-else-if="item.type === 'cascader'"
      v-model="form[item.prop]"
      :disabled="item.disabled"
      clearable
      :filterable="item.filterable"
      :props="{ multiple: item.multiple }"
      :options="item.dicData"
      :show-all-levels="item.showAllLevels"
      :separator="item.separator"
      style="width: 100%"
    ></el-cascader>

    <!-- 时间 -->
    <el-time-picker
      v-else-if="item.type === 'time'"
      v-model="form[item.prop]"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      style="width: 100%"
      clearable
    >
    </el-time-picker>
    <!-- 时间范围 -->
    <el-time-picker
      v-else-if="item.type === 'timerange'"
      is-range
      v-model="form[item.prop]"
      range-separator="至"
      :start-placeholder="item.startPlaceholder"
      :end-placeholder="item.endPlaceholder"
      :unlink-panels="item.unlinkPanels"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      clearable
    >
    </el-time-picker>
    <!-- 日期 -->
    <el-date-picker
      v-else-if="item.type === 'date'"
      v-model="form[item.prop]"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      clearable
    >
    </el-date-picker>
    <!-- 年 -->
    <el-date-picker
      v-else-if="item.type === 'year'"
      type="year"
      v-model="form[item.prop]"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      clearable
    >
    </el-date-picker>
    <!-- 月 -->

    <el-date-picker
      type="month"
      v-else-if="item.type === 'month'"
      v-model="form[item.prop]"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      clearable
    >
    </el-date-picker>
    <!-- 周 -->

    <el-date-picker
      type="week"
      v-else-if="item.type === 'week'"
      v-model="form[item.prop]"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      :value-format="item.valueFormat || 'yyyy-ww'"
      :format="item.format || 'yyyy 第 WW 周'"
      :disabled="item.disabled"
      clearable
    >
    </el-date-picker>
    <!-- 日期范围 -->

    <el-date-picker
      v-else-if="item.type === 'daterange'"
      type="daterange"
      range-separator="至"
      :start-placeholder="item.startPlaceholder"
      :end-placeholder="item.endPlaceholder"
      :unlink-panels="item.unlinkPanels"
      v-model="form[item.prop]"
      :value-format="item.valueFormat"
      :format="item.format"
      :disabled="item.disabled"
      clearable
    >
    </el-date-picker>

    <!-- 日期时间 -->
    <el-date-picker
      v-model="form[item.prop]"
      v-else-if="item.type === 'datetime'"
      type="datetime"
      :placeholder="item.placeholder ? item.placeholder : '请选择'"
      clearable
      :disabled="item.disabled"
      :picker-options="datetimeOptions"
      :value-format="item.valueFormat"
      :format="item.format"
    >
    </el-date-picker>

    <!-- 日期时间范围 -->
    <el-date-picker
      v-else-if="item.type === 'datetimerange'"
      v-model="form[item.prop]"
      type="datetimerange"
      :picker-options="datetimerangeOptions"
      range-separator="至"
      clearable
      :disabled="item.disabled"
      :start-placeholder="item.startPlaceholder"
      :end-placeholder="item.endPlaceholder"
      :value-format="item.valueFormat"
      :format="item.format"
      align="right"
    >
    </el-date-picker>
  </el-form-item>
</template>

<script>
/**
 * @description 自定义单组件
 */
import VwSwitchBgc from "./VwSwitchBgc.vue"
export default {
  name: "FormItemSelf",
  components: { VwSwitchBgc },
  inject: {
    vwForm: {
      default: {},
    },
  },
  props: {
    item: {
      type: Object,
    },
    form: {
      type: Object | Array,
    },
    hiddenLabel: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      datetimeOptions: {
        shortcuts: [
          {
            text: "今天",
            onClick(picker) {
              picker.$emit("pick", new Date())
            },
          },
          {
            text: "昨天",
            onClick(picker) {
              const date = new Date()
              date.setTime(date.getTime() - 3600 * 1000 * 24)
              picker.$emit("pick", date)
            },
          },
          {
            text: "一周前",
            onClick(picker) {
              const date = new Date()
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
              picker.$emit("pick", date)
            },
          },
        ],
      },
      datetimerangeOptions: {
        shortcuts: [
          {
            text: "最近一周",
            onClick(picker) {
              const end = new Date()
              const start = new Date()
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
              picker.$emit("pick", [start, end])
            },
          },
          {
            text: "最近一个月",
            onClick(picker) {
              const end = new Date()
              const start = new Date()
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
              picker.$emit("pick", [start, end])
            },
          },
          {
            text: "最近三个月",
            onClick(picker) {
              const end = new Date()
              const start = new Date()
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
              picker.$emit("pick", [start, end])
            },
          },
        ],
      },
    }
  },

  methods: {
    // 处理number 默认为0的问题
    numberReset() {
      if (this.item.type === "number") {
        this.$watch(
          `form.${this.item.prop}`,
          (val) => {
            if (!val && val !== 0 && val !== undefined) {
              this.form[this.item.prop] = undefined
            }
          },
          { immediate: true }
        )
      }
    },
  },

  created() {
    this.numberReset()
  },
}
</script>

<style lang="scss" scoped>
.el-input,
.el-select,
.el-cascader,
.el-date-editor {
  width: 100%;
}
.el-input-number {
  width: 100%;
}

::v-deep .el-input-number .el-input__inner {
  text-align: left;
  padding: 0 2px !important;
}
::v-deep .el-input .el-input__inner {
  padding: 0 6px !important;
}
.el-radio {
  padding: 2px 0;
}

// 去除禁用样式
::v-deep .is-disabled {
  input {
    background-color: #fff;
    color: #606266;
  }

  .el-textarea__inner,
  .el-input__inner {
    background-color: #fff;
    color: #606266;
  }
  .el-checkbox__inner,
  .el-radio__inner {
    background-color: #fff;
  }
  + span.el-checkbox__label,
  + span.el-radio__label {
    color: #606266;
  }
  &.is-checked {
    .el-radio__inner {
      border-color: #1890ff;
      background: #1890ff;
      &::after {
        background: #fff;
      }
    }
    + .el-radio__label {
      color: #1890ff;
    }

    .el-checkbox__inner {
      background-color: #1890ff;
      border-color: #1890ff;
      &::after {
        border-color: #fff;
      }
    }
  }
}

::v-deep .el-form-item__label {
  font-weight: bolder;
}
</style>
