<template>
  <div>
    <q-dialog v-model="show" persistent transition-show="scale" transition-hide="scale" @input="changeDig">
      <q-card style="width: 800px;max-width:900px;">
        <q-card-section class="row items-center q-pb-none">
          <div class="text-h6">{{ editType == 1 ? "新增约课" : "详情" }}</div>
          <q-space />
          <q-btn icon="close" flat round dense @click="changeDig(false)" />
        </q-card-section>
        <q-card-section class="q-pt-none scroll" style="max-height: 70vh">
          <div class="row col q-mr-lg q-col-gutter-md">
            <q-field filled label="日期" stack-label class="col-12">
              <template v-slot:control>
                <div>{{ dateObj.date }}</div>
              </template>
            </q-field>
            <!-- 详情显示内容 start-->
            <div class="col-12" v-if="editType == 2">
              <Detail :dateObj="dateObj" :saveObj="saveObj" :auth="auth" @success="detailSuccessHandle"
                @close="detailCloseHandle" />
            </div>
            <!-- 详情显示内容 end -->
            <q-select filled stack-label use-input option-value="CourseId" option-label="CourseName"
              v-model="teaClassMsg.CourseId" ref="CourseId" :options="CourseList" label="课程" :dense="false"
              class="col-12" emit-value map-options @filter="filterCourse"
              @input="getCanTeacherTimeList(), getChapterTree(), changeCourse()" v-if="editType == 1">
              <template v-slot:no-option>
                <q-item>
                  <q-item-section class="text-grey">
                    未找到相关数据
                  </q-item-section>
                </q-item>
              </template>
            </q-select>
            <select-tree v-show="teaClassMsg.CourseId > 0 && editType == 1" :treeData="chapterList"
              :defaultArray="returnString" nodeKey="ChapterId" labelKey="ChapterName" childrenKey="ChildList"
              tipText="章节" @getChild="getChapter" class="col-12" ref="selectTree"></select-tree>

            <q-select v-if="teaClassMsg.CourseId > 0 && editType == 1" filled v-model="teaClassMsg.TeacherId"
              option-value="TId" option-label="TeacherName" :options="teacherList" emit-value map-options label="老师"
              class="col-12" @input="getCanTeacherTimeList" />
            <q-field filled label-slot stack-label class="col-12" v-if="teaClassMsg.TeacherId > 0">
              <template #label>
                <div class="row flex">
                  上课时段
                  <span style="color:#f5576c;font-size:13px;margin-left:5px;font-weight:500">(按顺序选择)</span>
                  <div style="color:#333;font-size:13px;margin-left:10px;font-weight:500">
                    需选课时：{{ checkChapter.StudyMinutes }}分钟
                  </div>
                </div>
              </template>
              <template v-slot:control>
                <div v-if="teacherTimeList.length > 0">
                  <div v-for="(item, index) in teacherTimeList" :key="index">
                    <div v-if="
                        item.CourseTimeList && item.CourseTimeList.length > 0
                      ">
                      <div v-for="(_item, _index) in item.CourseTimeList" :key="_index" class="timeItem">
                        <q-checkbox v-model="courseCheckList" :val="_item">
                          {{ item.SchoolName }} {{ item.RoomName }}
                          {{ _item.StartTime }}-{{ _item.EndTime }}
                        </q-checkbox>
                      </div>
                    </div>
                    <div v-else>
                      暂无可约课程
                    </div>
                  </div>
                </div>
                <div v-else>
                  暂无可约课程
                </div>
              </template>
            </q-field>
            <div class="row col" v-show="
                (editType == 1 ||
                  (saveObj.ClassType == 3 && saveObj.AppointState == 1)) &&
                  auth.IsEdit&&showAddStu()
              ">
              <div class="col-10">
                <q-select filled stack-label use-input option-value="StuId" option-label="StuName" v-model="stuInfo"
                  ref="CourseId" :options="stuList" label="添加学员" :dense="false" class="col-6" @filter="filterStu">
                  <template v-slot:no-option>
                    <q-item>
                      <q-item-section class="text-grey">
                        未找到相关数据
                      </q-item-section>
                    </q-item>
                  </template>
                </q-select>
              </div>
              <div class="col-2 q-pt-md">
                <q-btn size="sm" color="accent" label="添加" @click="subscribeCourse" :loading="addLoading"
                  class="q-ml-md" :disable="!stuInfo.StuId || stuInfo.StuId <= 0" />
              </div>
            </div>
            <q-field filled label="已约学员" stack-label disable class="col-12" v-if="editType == 1&&addStuList.length>0">
              <template v-slot:control>
                <div v-for="(item,index) in addStuList" :key="index" class="q-mr-md">
                  {{ item }}
                </div>
              </template>
            </q-field>
          </div>
        </q-card-section>

        <q-separator />
        <q-card-actions align="right" class="bg-white">
          <q-btn label="取消" flat color="grey-10" style="font-weight:400 !important" @click="changeDig(false)" />
        </q-card-actions>
      </q-card>
    </q-dialog>
  </div>
</template>
<script>
  import {
    GetCanTeacherClassTimeList,
    GetCanAppointmentStuList,
    SetAdminScrollAppointment
  } from "../../../api/studyabroad/subscribe.js";
  import {
    queryCourseDropdownList,
    queryChapterTree
  } from "../../../api/course/index";
  import selectTree from "../../../components/common/select-tree";
  import Detail from "./detail.vue";
  import QCalendar from "@quasar/quasar-ui-qcalendar";
  export default {
    components: {
      selectTree,
      Detail
    },
    model: {
      prop: "show",
      event: "changeshow"
    },
    props: {
      dateObj: {
        type: Object,
        default: null
      },
      saveObj: {
        type: Object,
        default: null
      },
      show: {
        type: Boolean,
        default: false
      },
      editType: {
        type: Number,
        default: 1 //1:新增，2详情
      },
      teacherList: {
        type: Array,
        default: () => []
      },
      auth: {
        type: Object,
        default: () => {
          return {
            IsEdit: false
          };
        }
      }
    },
    watch: {
      show(val) {
        this.addLoading = false;
        this.addStuList = []
        if (val) {
          this.stuInfo = "";
          this.teaClassMsg.CourseId = 0;
          this.teaClassMsg.TeacherId = 0;
          this.chapterList = [];
          this.teacherTimeList = [];
          this.courseCheckList = [];
          this.stuList = [];
          this.allStuList = [];
          if (this.editType == 2&&this.saveObj.ClassType==3) {
            this.getStu();
          }
        }
      }
    },
    data() {
      return {
        CourseList: [], //关联课程下拉数据
        AllCourseList: [], //所有课程列表
        teacherTimeList: [],
        teaClassMsg: {
          Date: "",
          TeacherId: 0,
          CourseId: 0
        },
        stuList: [],
        allStuList: [],
        stuMsg: {
          CourseId: 0,
          NextCourseGradeNo: 0
        },
        detailObj: {},
        detailMsg: {
          StuId: 0,
          GuestId: 0
        },
        saveMsg: {
          Date: "",
          TeacherId: 0,
          ShiftSort: "",
          StuId: 0,
          GuestId: 0,
          CourseId: 0,
          ChapterNo: 0,
          CourseGradeId: 0
        },
        stuInfo: "",
        checkStuList: [],
        courseCheckList: [],
        addLoading: false,
        chapterList: [], //章节列表，
        checkChapter: {}, //选择的章节
        returnString: [], //章节默认值
        addStuList: [], //新增时展示用
      };
    },
    mounted() {
      this.getCourseList();
    },
    methods: {
      //开关弹窗
      changeDig(val) {
        this.$emit("changeshow", val);
        if (!val) {
          this.stuList = [];
          this.allStuList = [];
        }
      },
      //获取课程
      getCourseList() {
        queryCourseDropdownList({
          IsQPrice: 1,
          IsQuerySalePlat: 0,
          IsScrollClass: 1
        }).then(res => {
          if (res.Code == 1) {
            this.CourseList = res.Data;
            var obj = {
              CourseName: "请选择",
              CourseId: 0
            };
            this.CourseList.unshift(obj);
            this.AllCourseList = res.Data;
          }
        });
      },
      changeCourse() {
        this.teaClassMsg.TeacherId = 0;
        this.checkChapter = {};
        this.checkStuList = [];
        this.stuInfo = "";
        this.$refs.selectTree.clearData();
      },
      //筛选课程
      filterCourse(val, update) {
        update(() => {
          if (val === "") {
            this.CourseList = JSON.parse(JSON.stringify(this.AllCourseList));
          } else {
            const needle = val.toLowerCase();
            this.CourseList = this.AllCourseList.filter(
              v => v.CourseName.toLowerCase().indexOf(needle) > -1
            );
          }
        });
      },

      //获取老师的空闲上课时段
      getCanTeacherTimeList() {
        this.teaClassMsg.Date = this.dateObj.date;
        this.courseCheckList=[]
        this.stuInfo = "";
        if (this.teaClassMsg.TeacherId == 0) return;
        GetCanTeacherClassTimeList(this.teaClassMsg).then(res => {
          this.teacherTimeList = res.Data;
        });
      },
      //获取学生列表
      getStu() {
        this.stuMsg.CourseId = this.teaClassMsg.CourseId || 0;
        if (this.editType == 1) {
          this.stuMsg.CourseGradeId = this.checkChapter.CourseRate || 0;
          this.stuMsg.NextCourseGradeNo = this.checkChapter.ChapterGradeNo || 0;
        }
        if (this.editType == 2) {
          this.stuMsg.CourseGradeId = this.saveObj.CourseGradeId || 0;
          this.stuMsg.NextCourseGradeNo = this.saveObj.Ranks || 0;
        }
        GetCanAppointmentStuList(this.stuMsg).then(res => {
          this.stuList = JSON.parse(JSON.stringify(res.Data));
          this.allStuList = JSON.parse(JSON.stringify(res.Data));
        });
      },
      //筛选学生
      filterStu(val, update) {
        update(() => {
          if (val === "") {
            this.stuList = JSON.parse(JSON.stringify(this.allStuList));
          } else {
            const needle = val.toLowerCase();
            this.stuList = this.allStuList.filter(
              v => v.StuName.toLowerCase().indexOf(needle) > -1
            );
          }
        });
      },
      //获取章节
      getChapterTree() {
        if (this.teaClassMsg.CourseId == 0) return;
        const msg = {
          CourseId: this.teaClassMsg.CourseId
        };
        queryChapterTree(msg).then(res => {
          this.chapterList = res.Data;
          this.chapterList.forEach(e => {
            this.mapChapter(e.ChildList, "ChildList");
          });
        });
      },
      //禁用第一层后的子级
      mapChapter(arr = [], key) {
        arr.forEach(e => {
          e.disabled = true;
          if (e[key] && e[key].length > 0) {
            this.mapChapter(e[key]);
          }
        });
      },
      //章节选择
      getChapter(data) {
        this.checkStuList = [];
        this.stuInfo = "";
        this.chapterList.map(e => {
          if (e.ChapterId == data) {
            this.checkChapter = e;
            return;
          }
        });
        if (this.checkChapter.CourseRate && this.checkChapter.ChapterNo) {
          this.getStu();
        }
        this.teaClassMsg.TeacherId = 0;
        this.teacherTimeList = [];
      },
      subscribeCourse() {
        if (
          new Date(this.dateObj.date).getTime() <
          new Date(QCalendar.today()).getTime()
        ) {
          this.$q.notify({
            message: `日期小于今天,请重新选择日期`,
            position: "top",
            type: "negative"
          });
          return;
        }
        if (this.stuInfo.AppointDate) {
          if (
            new Date(this.dateObj.date).getTime() <
            new Date(this.stuInfo.AppointDate).getTime()
          ) {
            this.$q.notify({
              message: `${this.stuInfo.StuName},不能预约${this.stuInfo.AppointDate}之前的日期`,
              position: "top",
              type: "negative"
            });
            return;
          }
        }

        if (this.editType == 1) {
          if (this.courseCheckList.length === 0) {
            this.$q.notify({
              message: "请选择上课时段",
              position: "top",
              type: "negative"
            });
            return;
          }
          const totalTime = this.courseCheckList.reduce((pre, cur) => {
            return (pre += cur.Minutes);
          }, 0);
          if (this.checkChapter.StudyMinutes !== totalTime) {
            this.$q.notify({
              message: "课时不匹配，请重新上课时段",
              position: "top",
              type: "negative"
            });
            return;
          }
          let newCourseCheckList = this.courseCheckList.sort((a, b) => {
            return a.Sort - b.Sort;
          });
          for (let i = 0; i < newCourseCheckList.length; i++) {
            if (i > 0) {
              const cur = newCourseCheckList[i].Sort;
              const pre = newCourseCheckList[i - 1].Sort;
              if (cur - pre > 1) {
                this.$q.notify({
                  message: "请按顺序选择上课时段",
                  position: "top",
                  type: "negative"
                });
                return;
              }
            }
          }
          this.saveMsg.Date = this.dateObj.date;
          this.saveMsg.StuId = this.stuInfo.StuId;
          this.saveMsg.StuName = this.stuInfo.StuName;
          this.saveMsg.GuestId = this.stuInfo.GuestId;
          this.saveMsg.CourseId = this.teaClassMsg.CourseId;
          this.saveMsg.TeacherId = this.teaClassMsg.TeacherId;
          this.saveMsg.ChapterNo = this.checkChapter.ChapterNo;
          this.saveMsg.CourseGradeId = this.checkChapter.CourseRate;
          this.saveMsg.ShiftSort = newCourseCheckList.map(e => e.Sort).toString();
        } else if (this.editType == 2) {
          this.saveMsg.Date = this.dateObj.date;
          this.saveMsg.StuId = this.stuInfo.StuId;
          this.saveMsg.StuName = this.stuInfo.StuName;
          this.saveMsg.GuestId = this.stuInfo.GuestId;
          this.saveMsg.CourseId = 0;
          this.saveMsg.TeacherId = this.saveObj.Tid;
          this.saveMsg.ChapterNo = this.saveObj.Ranks;
          this.saveMsg.CourseGradeId = this.saveObj.CourseGradeId;
          this.saveMsg.ShiftSort = this.saveObj.ShiftSort;
        }
        this.addLoading = true;
        SetAdminScrollAppointment(this.saveMsg)
          .then(res => {
            this.addLoading = false;
            if (res.Code == 1) {
              this.$q.notify({
                message: "操作成功",
                position: "top"
              });
              if (this.editType == 1) {
                this.addStuList.push(this.stuInfo.StuName)
              }
              if (this.editType == 2) {
                this.saveObj.GuestList.push({
                  GuestName: this.stuInfo.StuName,
                  AppointmentId: res.Data
                });
              }
              this.stuInfo = "";
              this.getStu();
              this.$emit("success");
            }
          })
          .catch(() => {
            this.addLoading = false;
          });
      },
      detailSuccessHandle() {
        this.getStu();
        this.$emit("success");
      },
      detailCloseHandle() {
        this.changeDig(false);
        this.$emit("success");
      },
      showAddStu() {
        if (new Date(this.dateObj.date).getTime() < new Date(QCalendar.today()).getTime()) {
          return false;
        } else {
          return true;
        }
      }
    }
  };

</script>
<style>
  .q-calendar-daily__day-interval:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-weekly__workweek:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-weekly__day:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-weekly__head-weekday:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-scheduler__day:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-resource__resource-interval:hover {
    background: rgba(0, 0, 255, 0.1);
  }

  .q-calendar-daily__day:hover {
    background: rgba(0, 0, 255, 0.1);
  }

</style>
<style>
  .upload-assiatant-box .q-uploader__list {
    display: none;
  }

  .upload-assiatant-box .q-uploader {
    width: auto;
  }

  .timeItem {
    margin: 10px 0;
  }

</style>
