<template>
  <div class="subPage">
    <form class="mainForm">
      <ul>
        <li class="flex-h">
          <span>对应案场:<em>*</em></span>
          <div class="flex-item">
            <div style="width:50%">
              <el-select :disabled="id && id !== ''" v-model="CaseId" placeholder="请选择" @change="caseChange">
                <el-option
                  key="all"
                  label="全部案场"
                  value="all">
                </el-option>
                <el-option
                  v-for="item in caseList"
                  :key="item.CaseId"
                  :label="item.CaseName"
                  :value="item.CaseId">
                </el-option>
              </el-select>
            </div>
          </div>
        </li>
        <li class="flex-h">
          <span>名称:<em>*</em></span>
          <div class="flex-item">
            <div style="width:50%">
              <el-input
                placeholder="请输入名称"
                v-model="detail.Name"
                clearable>
              </el-input>
            </div>
          </div>
        </li>
        <li class="flex-h">
          <span>标题:</span>
          <div class="flex-item">
            <div style="width:50%">
              <el-input
                placeholder="请输入标题"
                v-model="detail.Title"
                clearable>
              </el-input>
            </div>
          </div>
        </li>
        <li class="flex-h">
          <span>图片:<em>*</em></span>
          <div class="flex-item">
            <el-upload
              class="avatar-uploader"
              action='string'
              :http-request="toolClass.upload"
              :show-file-list="false"
              :on-success="handleImgSuccess">
              <img v-if="imgShow" :src="imgShow" class="avatar">
              <i v-else class="el-icon-plus avatar-uploader-icon"></i>
            </el-upload>
          </div>
        </li>
        <li class="flex-h">
          <span>详细图片:<em>*</em></span>
          <div class="flex-item">
            <el-upload
              class="avatar-uploader"
              action='string'
              :http-request="toolClass.upload"
              :show-file-list="false"
              :on-success="handleDetailImgSuccess">
              <img v-if="detailImgShow" :src="detailImgShow" class="avatar">
              <i v-else class="el-icon-plus avatar-uploader-icon"></i>
            </el-upload>
          </div>
        </li>
        <li class="flex-h">
          <span>专题简介:<em>*</em></span>
          <div class="flex-item">
            <div style="width:50%">
              <el-input
                placeholder="请输入专题简介"
                v-model="detail.DetailContent"
                type='textarea'
                :autosize="{ minRows: 3, maxRows: 5}"
                clearable>
              </el-input>
            </div>
          </div>
        </li>
        <li class="flex-h">
          <span>展示课程:<em>*</em></span>
          <div class="flex-item">
            <div style="width:50%" class="radio">
              <el-radio v-model="detail.IsAllCourse" :label='1' >全部课程</el-radio>
              <el-radio v-model="detail.IsAllCourse" :label='0' >指定课程</el-radio>
            </div>
          </div>
        </li>
        <li class="flex-h" v-if="detail.IsAllCourse === 0">
          <el-table
            :data="detail.Courses"
            stripe
            style="width: 100%">
            <el-table-column
              prop="CourseName"
              label="课程名称">
            </el-table-column>
            <el-table-column
              prop="BeginDate"
              label="课程开始时间">
              <template slot-scope="scope">
                <label>{{toolClass.dateFormat(scope.row.BeginDate,'yyyy-MM-dd')}}</label>
              </template>
            </el-table-column>
            <el-table-column
              prop="EndDate"
              label="课程结束时间">
              <template slot-scope="scope">
                <label>{{toolClass.dateFormat(scope.row.EndDate,'yyyy-MM-dd')}}</label>
              </template>
            </el-table-column>
            <el-table-column label="操作" width="450">
              <template slot-scope="scope">
                <el-button
                  size="mini"
                  type="danger"
                  @click="deleteItem(scope.row)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
            <el-button type="primary" size="mini" @click="coursesShow">新增</el-button>
        </li>
        <li class="flex-h">
          <span>是否前台展示:<em>*</em></span>
          <div class="flex-item">
            <div style="width:50%" class="radio">
              <el-radio v-model="detail.Status" :label='1' >是</el-radio>
              <el-radio v-model="detail.Status" :label='0' >否</el-radio>
            </div>
          </div>
        </li>
        <li style="text-align:center">
          <el-button type="primary" size="mini" @click="submit">保存</el-button>
          <el-button type="danger" size="mini" @click="cancel">取消</el-button>
        </li>
      </ul>
    </form>
    <el-dialog
      title="选择课程"
      :visible.sync="selCourseVisible"
      width="500px"
      center>
      <div>
        <el-table
          ref="courseTable"
          :data="coursesList"
          tooltip-effect="dark"
          stripe
          @selection-change="handleSelectionChange"
          style="width: 100%">
          <el-table-column
            type="selection"
            width="55">
          </el-table-column>
          <el-table-column
            prop="CourseName"
            label="课程名称">
          </el-table-column>
          <el-table-column
            prop="BeginDate"
            label="课程开始时间">
            <template slot-scope="scope">
              <label>{{toolClass.dateFormat(scope.row.BeginDate,'yyyy-MM-dd')}}</label>
            </template>
          </el-table-column>
          <el-table-column
            prop="EndDate"
            label="课程结束时间">
            <template slot-scope="scope">
              <label>{{toolClass.dateFormat(scope.row.EndDate,'yyyy-MM-dd')}}</label>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="selCourseVisible = false">取 消</el-button>
        <el-button type="primary" @click="addCourseOk">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { createNamespacedHelpers, mapState } from 'vuex'

const { mapState: mapCaseState, mapActions: mapCaseActions } = createNamespacedHelpers('cmscase')
const { mapState: mapCourseState, mapActions: mapCourseActions } = createNamespacedHelpers('course')

export default {
  name: '',
  data () {
    return {
      id: '',
      limit: 1,
      // imgs: null,
      // detailimgs: null,
      img: '',
      detailimg: '',
      selCourseVisible: false,
      selCourseList: [],
    }
  },
  components: {},
  computed: {
    ...mapState({
      caseList: x => x.app.cases.list,
      defaultCaseId: x => x.app.cases.default,
      OrgId: x => x.app.user.OrgId
    }),
    ...mapCaseState({
      detail: x => x.caseInfo,
    }),
    ...mapCourseState({
      courses: x => x.courseList,
    }),
    CaseId: {
      get () {
        return this.detail.CaseId || this.caseid
      },
      set (val) {
        this.UpdateInfo({ ...this.detail, CaseId: val })
        this.getCourse()
      }
    },
    imgShow () {
      return this.img || ((this.detail.CmsCaseImgs || []).filter(x => x.ImageType === 'cover')[0] || {}).CaseImageUrl
    },
    detailImgShow () {
      return this.detailimg || ((this.detail.CmsCaseImgs || []).filter(x => x.ImageType === 'detail')[0] || {}).CaseImageUrl
    },
    coursesList () {
      return (this.courses.list || []).map(x => {
        return {
          CourseId: x.CourseId,
          CourseName: x.CourseName,
          BeginDate: x.BeginDate,
          EndDate: x.BeginDate
        }
      })
    },
  },
  methods: {
    ...mapCaseActions([
      'GetCaseInfo',
      'AddCaseInfo',
      'SetNull',
      'UpdateInfo',
    ]),
    ...mapCourseActions([
      'GetCourseList',
    ]),
    caseChange () {
      this.selCourseList = []
      this.detail.Courses = []
    },
    checkFn (arr) {
      for (var n = 0; n < arr.length; n++) {
        if (arr[n].type === 'isNull' && !arr[n].target) {
          this.$message({
            message: arr[n].errorMsg,
            type: 'error'
          })
          return false
        }
      }
      return true
    },
    submit () {
      var checkOff = this.checkFn([{
        target: Boolean(this.CaseId || ''),
        errorMsg: '对应案场不能为空',
        type: 'isNull'
      }, {
        target: Boolean(this.detail.Name || ''),
        errorMsg: '名称不能为空',
        type: 'isNull'
      }, {
        target: Boolean(this.imgShow || ''),
        errorMsg: '图片不能为空',
        type: 'isNull'
      }, {
        target: Boolean(this.detailImgShow || ''),
        errorMsg: '详细图片不能为空',
        type: 'isNull'
      }, {
        target: Boolean(this.detail.DetailContent || ''),
        errorMsg: '专题简介不能为空',
        type: 'isNull'
      }, {
        target: Boolean(String(this.detail.IsAllCourse) || ''),
        errorMsg: '展示课程不能为空',
        type: 'isNull'
      }, {
        target: Boolean(String(this.detail.Status) || ''),
        errorMsg: '是否前台展示不能为空',
        type: 'isNull'
      }])
      if (!checkOff) {
        return false
      }
      if (this.detail.IsAllCourse === '0' && !this.detail.Courses.length) {
        this.$message({
          message: '选择指定课程不能为空',
          type: 'error'
        })
        return false
      }
      const courseids = (this.detail.Courses || []).map(x => x.CourseId).join(',')
      if (this.id === '') {
        this.detail.OrgId = this.OrgId
        // console.log(JSON.stringify({ ...this.detail, OrgId: this.OrgId, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids }))
        this.AddCaseInfo({ ...this.detail, OrgId: this.OrgId, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids }).then((res) => {
          this.afterSave()
        })
      } else {
        // console.log(JSON.stringify({ ...this.detail, OrgId: this.OrgId, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids }))
        this.AddCaseInfo({ ...this.detail, imgs: this.imgShow, detailimgs: this.detailImgShow, courseids }).then((res) => {
          this.afterSave()
        })
      }
    },
    afterSave () {
      this.$message({
        message: '保存成功',
        type: 'success',
        duration: 1000
      })
      this.$router.push({ name: 'indexCase' })
    },
    cancel () {
      this.$router.go(-1)
    },
    getDetail () {
      this.GetCaseInfo({ id: this.id })
    },
    getCourse () {
      this.GetCourseList({ caseid: this.CaseId === 'all' ? '' : this.CaseId, page: 1, pagesize: 100, status: 1 })
    },
    toggleSelection (rows) {
      if (rows) {
        rows.forEach(row => {
          this.$refs.courseTable.toggleRowSelection(row)
        })
      } else {
        this.$refs.courseTable.clearSelection()
      }
    },
    addCourse () {
      this.GetCourseList({ caseid: this.CaseId === 'all' ? '' : this.CaseId, page: 1, pagesize: 100, callback: this.coursesShow })
    },
    coursesShow () {
      this.selCourseList = this.detail.Courses || []
      this.selCourseVisible = true
      setTimeout(() => {
        this.toggleSelection(this.coursesList.filter(x => (this.selCourseList || []).filter(y => y.CourseId === x.CourseId).length > 0))
      }, 30)
    },
    handleSelectionChange (val) {
      this.selCourseList = val
    },
    addCourseOk () {
      this.UpdateInfo({ ...this.detail, Courses: this.selCourseList })
      this.selCourseVisible = false
    },
    deleteItem (row) {
      this.UpdateInfo({ ...this.detail, Courses: this.detail.Courses.filter(x => x.CourseId !== row.CourseId) })
    },
    handleImgSuccess (res, file) {
      this.img = res.result.url
    },
    handleDetailImgSuccess (res, file) {
      this.detailimg = res.result.url
    }
  },
  mounted () {
    this.getCourse()
    const { id } = this.$route.query
    this.id = id
    if (id && id !== '') {
      this.getDetail()
    } else {
      this.SetNull()
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
</style>