<template>
  <div class="taskListBox">
    <div class="header">
      <div class="title">
        <img src="../../assets/images/mount_head.png" />
        <div class="font">{{ $t('common.航线库') }}</div>
      </div>
    </div>
    <el-form class="task-main" label-width="100px">
      <el-form-item :label="$t('common.任务库')" v-if="useTask">
        <el-select v-model="selectedTaskId" clearable>
          <el-option
            v-for="(item, i) in taskList"
            :label="item.name"
            :value="item.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item :label="$t('common.航线选择')">
        <el-select
          v-model="selectedAirwayId"
          :disabled="airwaySelectDisabled"
          clearable
        >
          <el-option
            v-for="(item, i) in airwayList"
            :label="item.name"
            :value="item.id"
          ></el-option>
        </el-select>
      </el-form-item>
      <div class="btn" @click="onStartTask" v-hover>{{ $t('common.一键任务') }}</div>
      <div class>
        <span class="btn__add-line" @click="showAirwayEdit = true">
          <span class="f8"></span> {{ $t('common.创建航线') }}
        </span>
      </div>
    </el-form>
    <AirwayEdit
      v-if="showAirwayEdit"
      @close="showAirwayEdit = false"
      @addDone="getAirwayList"
    ></AirwayEdit>
  </div>
</template>
<script>
import { Utils } from "../../../../../../../../lib/cesium";
import { mapState, mapActions } from "vuex";
import { Control_API, TaskInfo } from "../../../../../../../../api";
import AirwayEdit from "./components/airwayEdit";

const airwayEntities = []; // 航线实体
let point_entity = null;

export default {
  name: "taskList",
  components: { AirwayEdit },
  props: {},
  inject: ["rootNode", "bus"],
  data() {
    return {
      airwayList: [], //航线列表
      selectedAirwayId: "", // 选择的航线
      taskList: [], //任务列表
      selectedTaskId: "", //选择的任务
      airwaySelectDisabled: false, //选择任务后, 禁用航线选择
    };
  },
  computed: {
    ...mapState("MMCFlightControlCenter", [
      "cesiumViewer",
      "useSTLAirway",
      "useTask",
    ]),
    ...mapState("MMCFlightControlCenter/uav", ["uav", "uavRealTimeData"]),
    // 选择的任务
    selectedTask() {
      let find = this.taskList.find((item) => {
        return item.id == this.selectedTaskId;
      });
      if (find) {
        return find;
      } else {
        return {
          name: "",
          id: -1,
        };
      }
    },
    // 选择的航线
    selectedAirway() {
      let find = this.airwayList.find((item) => {
        return item.id == this.selectedAirwayId;
      });
      if (find) {
        return find;
      } else {
        return {
          name: "",
          id: -1,
        };
      }
    },
    // 创建航线窗口
    showAirwayEdit: {
      get() {
        return this.$store.state.MMCFlightControlCenter.showAirwayEdit;
      },
      set(val) {
        this.$store.commit("MMCFlightControlCenter/setState", {
          key: "showAirwayEdit",
          value: val,
        });
      },
    },
    listCollapse: {
      get() {
        return this.$store.state.MMCFlightControlCenter.listCollapse;
      },
      set(val) {
        this.$store.commit("MMCFlightControlCenter/setState", {
          key: "listCollapse",
          value: val,
        });
      },
    },
  },
  watch: {
    "uavRealTimeData.isFlying": {
      handler: function (newVal, oldVal) {
        if (oldVal === false && newVal === true) {
          this.getTaskInfoRecord();
        }
      },
      deep: true,
      immediate: true,
    },
    showAirwayEdit(newVal) {
      if (newVal) {
        this.listCollapse = true;
      }
    },
    selectedTask() {
      if (this.selectedTask.id !== -1) {
        this.airwaySelectDisabled = true;
      } else {
        this.airwaySelectDisabled = false;
      }
      // 任务改变则修改航线选择为任务中的航线
      this.selectedAirwayId = this.selectedTask?.airwayId;
    },
    selectedAirway() {
      this.clearAirwayEntities();
      if (this.selectedAirway.id !== -1) {
        try {
          let airway = this.selectedAirway.content;
          this.createAirwayEntities({
            polyline: airway,
            id: airway.id,
          });
          console.log("选中的航线", this.selectedAirway);
        } catch (e) {
          console.log("绘制航线失败", e);
        }
      } else {
        if (this.selectedTaskId && this.selectedAirwayId == "") {
          this.$message.warning(this.$t('common.未找到相应的航线'));
        }
        this.selectedAirwayId = "";
        this.airwaySelectDisabled = false;
      }
    },
  },
  async created() {
    this.bus.$on("startTask", this.onStartTask);
    this.bus.$on("refreshAirway", this.getAirwayList);
    await this.getTaskList();
    await this.getAirwayList();
    console.log(this.uavRealTimeData, "this.uavRealTimeData");
    // 获取正在飞行的航线
    if (this.uavRealTimeData.isFlying) {
      this.getTaskInfoRecord();
    }
  },
  beforeDestroy() {
    this.bus.$off("startTask", this.onStartTask);
    this.bus.$off("refreshAirway", this.getAirwayList);
    this.clearAirwayEntities();
  },
  methods: {
    ...mapActions("MMCFlightControlCenter", [
      "createAirwayEntities",
      "clearAirwayEntities",
      "apiPointsToFKZXPoints",
    ]),
    ...mapActions("MMCFlightControlCenter/uav", ["isTakeOver"]),
    /**
     * 获取任务列表
     */
    async getTaskInfoRecord() {
      let res = await TaskInfo.getTaskInfoRecord({
        deviceId: this.uav && this.uav.deviceId,
      });
      if (res.code === 0) {
        this.selectedTaskId = res.data.taskInfoId;
        setTimeout(() => {
          this.selectedAirwayId = res.data.reouteId;
        }, 1000);
      }
    },
    getTaskList(id) {
      return new Promise((resolve) => {
        console.log("getTaskList", this.taskListAll);
        this.rootNode.$emit("taskListGet", {
          pageNo: 1,
          pageSize: 100,
          type: 0,
          // taskStatus: 1, // 任务状态 0：待审批 1：待执行 2：执行中 3：执行完成 4:审批不通过
          callback: (res) => {
            this.taskList = res?.records.filter(
              (item) => item.status != "已完成"
            );
            this.$nextTick(() => {
              if (id) {
                this.selectedTaskId = id;
              }
              resolve();
            });
          },
        });
      });
    },
    /**
     * 获取航线列表
     */
    getAirwayList(id) {
      return new Promise((resolve) => {
        console.log("getAirwayList", this.taskListAll);
        this.rootNode.$emit("airwayListGet", {
          pageNo: 1,
          pageSize: 100,
          callback: (res) => {
            this.airwayList = res?.records || [
              /* {
                id: item.id,
                name: item.flightName,
                organizationName: "无",
                status: "可用", //空域状态
                safe: item.safe ? 1 : 0, // 安全状态1: 安全 , 0: 待确定,
                labelName: "无",
                //航线数据
                content,
                finishedAction: "GO_HOME"
              } */
            ];
            this.$nextTick(() => {
              if (id) {
                this.selectedAirwayId = id;
              }
              resolve();
            });
          },
        });
      });
    },
    /**
     * 一键任务事件
     */
    async onStartTask() {
      // 判断是否已接管
      if (!(await this.isTakeOver())) {
        this.$message.warning(this.$t('common.请先接管设备'));
        return;
      }

      // 判断是否选择了航线
      if (this.selectedAirway.id === -1) {
        this.$message.warning(this.$t('common.请选择航线'));
        return;
      }
      let diversionPoint = this.uav.diversionPoint;
      if (!diversionPoint) {
        return this.$message.warning(this.$t('common.设备暂无备降点无法进行一键任务，请前往后台管理设置备降点！'));
      }
      let data = this.taskList.filter((item) => item.id == this.selectedTaskId);
      if (data && data[0].status == "执行中") {
        return this.$message.warning(this.$t('common.当前任务执行中'));
      }
  
      try {
        await this.$confirm(this.$t('common.请确认是否进行一键任务操作?'), this.$t('common.安全确认'), {
          cancelButtonText: this.$t('common.取消'),
          confirmButtonText: this.$t('common.确定'),
          customClass: "uav_controlPane",
          showClose: false,
        });
        // 
        this.$store.commit("MMCFlightControlCenter/uav/setState", {
          key: "airlineData",
          value: this.selectedAirway,
        });
        this.$store.dispatch("MMCFlightControlCenter/uav/takeOff", {
          taskInfoId: this.selectedTaskId,
          callback: (status) => {
            if (status) {
              this.$message.success(this.$t('common.一键任务指令发送成功'));
            } else {
              this.$message.error(this.$t('common.一键任务指令发送失败'));
            }
          },
        });
        this.rootNode.$emit("taskStart", {
          uav: this.uav,
          task: this.selectedTask,
          airway: this.selectedAirway,
        });
      } catch (e) {}
    },
  },
};
</script>
<style lang="scss" scoped>
.taskListBox {
  min-height: 200px;
  width: 350px;
  background: #222222;
  border-radius: 12px;
  transition: 0.3s;
  display: flex;
  flex-direction: column;

  .header {
    flex-shrink: 0;
    display: flex;
    justify-content: space-between;
    height: 32px;
    background: #3c3c3c;
    border-radius: 12px 12px 0px 0px;
    .title {
      display: flex;
      align-items: center;
      margin-left: 10px;
      .font {
        font-size: 20px;
        font-family: YouSheBiaoTiHei;
        color: #14faff;
        line-height: 26px;
        text-shadow: 0px 1px 1px rgba(2, 32, 56, 0.2);
        background-image: -webkit-linear-gradient(
          right,
          #e3aa77,
          #f5cda9,
          #f9ecd3,
          #fcdbb1,
          #edb07a
        );
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
      }
    }
    .active {
      background-image: linear-gradient(
        180deg,
        #9198ff 0%,
        rgba(45, 81, 153, 0.22) 40%,
        #05091a 100%
      );
      border: 1px solid #70daf9;
      box-shadow: inset 0 0 10px 2px #3f9dff;
      font-family: MicrosoftYaHei-Bold;
      font-size: 14px;
      color: #70daf9;
      letter-spacing: 0;
      font-weight: 700;
    }

    .default {
      background-image: linear-gradient(
        180deg,
        #9198ff 0%,
        rgba(45, 81, 153, 0.22) 40%,
        #05091a 100%
      );
      border: 1px solid #70daf9;
      font-family: MicrosoftYaHei-Bold;
      font-size: 14px;
      color: rgba(112, 218, 249, 0.5);
      letter-spacing: 0;
      font-weight: 700;
    }
  }
  .task-main::v-deep {
    flex: auto;
    padding: 38px 16px 16px;
    position: relative;
    display: flex;
    flex-direction: column;

    .el-form-item__label {
      color: #fff;
    }

    .btn__add-line {
      position: absolute;
      bottom: 20px;
      right: 20px;
      font-size: 10px;
      color: #43deff;
      cursor: pointer;
    }
  }

  .btn {
    width: 122px;
    height: 32px;
    text-align: center;
    line-height: 32px;
    margin: 0 auto;
    color: #fff;
    background: #3388ff;
    font-family: SourceHanSansCN, SourceHanSansCN;
    font-weight: 400;
    font-size: 14px;
    cursor: pointer;
  }
}
.select-airway__btn {
  width: 100%;
  height: 30px;
  padding: 0;
}
</style>
