<template>
  <el-dialog
    :title="title"
    :visible="visible"
    :before-close="onHide"
    custom-class="points-assign-dialog">
    <div class="filter-container filter-view">
      <el-select
        style="min-width: 70px; max-width: 120px;"
        clearable
        v-model="filter.pageCriteria.assignmentStatus"
        placeholder="Status"
        @change="onSearch">
        <el-option
          v-for="(item, index) in statusOptions"
          :key="index"
          :label="item"
          :value="item"/>
      </el-select>
      <div style="flex: 1; min-width: 150px; max-width: 300px;">
        <el-input
          clearable
          v-model="filter.pageCriteria.criteria"
          placeholder="Search by Brand and Model"
          @keyup.enter.native="onSearch"
          v-if="isVehicle"/>
        <el-input
          clearable
          v-model="filter.pageCriteria.criteria"
          placeholder="Search by Site Name or Service Provider"
          @keyup.enter.native="onSearch"
          v-else/>
      </div>
      <el-button
        type="primary"
        @click="onSearch">
        Search
      </el-button>
    </div>
    <div class="assign-table-actions">
      <el-button
        type="danger"
        :disabled="selectRow.length == 0"
        :loading="loading.unassign"
        @click="onClickUnassign">
        Batch Un-assign
      </el-button>
      <el-button
        type="accent"
        :disabled="selectRow.length == 0"
        :loading="loading.assign"
        @click="onClickAssign">
        Batch Assign
      </el-button>
    </div>
    <div class="table-view" v-loading="table.loading">
      <el-table
        :data="table.data"
        height="100%"
        class="no-border"
        @selection-change="changeSelection"
        v-if="visible">
        <template v-if="isVehicle">
          <el-table-column
            align="center"
            label="Brand"
            prop="vehicleBrand"
            min-width="120"/>
          <el-table-column
            align="center"
            label="Model"
            prop="vehicleModel"
            min-width="120"/>
        </template>
        <template v-else>
          <el-table-column
            align="center"
            label="Site Name"
            prop="siteName"
            min-width="130"/>
          <el-table-column
            align="center"
            label="Address"
            prop="address"
            min-width="120"/>
          <el-table-column
            align="center"
            label="Service Provider"
            min-width="140">
            <template slot-scope="{row}">
              <div v-for="item in row.serviceProviders" :key="item">{{item}}</div>
            </template>
          </el-table-column>
        </template>
        <el-table-column
          align="center"
          label="Assignment Status"
          prop="assignmentStatus"
          min-width="150"/>
        <el-table-column
          align="center"
          label="Select"
          type="selection"/>
      </el-table>
    </div>
    <div class="center" style="margin-bottom: -20px;">
      <Pagination
        v-show="table.total"
        :total="table.total"
        :page.sync="filter.pageNum"
        :limit.sync="filter.pageSize"
        @pagination="getTableData"/>
    </div>
  </el-dialog>
</template>

<script>
import apiBase from '@/api/apiBase';
import points from '@/api/points';
import Pagination from '@/components/Pagination'
export default {
  name: "AssignmentDialog",
  props: {
    title: {
      type: String,
      default: "ASSIGN SITES"
    },
    visible: {
      type: Boolean,
      default: false
    },
    isVehicle: {
      type: Boolean,
      default: false
    },
    pointsId: {
      type: String,
      default: ""
    }
  },
  components: {Pagination},
  data() {
    return {
      filter: {
        pageNum: 1,
        pageSize: 10,
        pageCriteria: {
          criteria: "",
          dynamicPointsId: "",
          assignmentStatus: ""
        }
      },
      table: {
        data: [],
        total: 0,
        loading: false
      },
      loading: {
        assign: false,
        unassign: false
      },
      selectRow: [],
      statusOptions:[]
    };
  },
  mounted() {
    this.getStatusOptions();
  },
  watch: {
    visible: {
      handler(n, o) {
        if (n) {
          this.filter.pageCriteria.dynamicPointsId = this.pointsId;
          this.onSearch();
        }
      }
    }
  },
  methods: {
    onHide() {
      this.$emit("hide");
    },
    onSearch() {
      this.filter.pageNo = 1;
      this.getTableData();
    },
    getStatusOptions() {
      apiBase.getAssignStatusOptions().then(res => {
        if (res.data) {
          this.statusOptions = res.data
        }
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
      })
    },
    getTableData() {
      this.selectRow = []
      this.table.loading = true;
      const promise = this.isVehicle 
        ? points.getVehicleAssignmentPages(this.filter)
        : points.getSiteAssignmentPages(this.filter)
      promise.then(res => {
        if (res.data.totalRow && res.data.records) {
          this.table.total = res.data.totalRow;
          this.table.data = res.data.records;
        } else {
          this.table.total = 0;
          this.table.data = [];
        }
        this.table.loading = false;
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
        this.table.total = 0;
        this.table.data = [];
        this.table.loading = false;
      })
    },
    changeSelection(val) {
      this.selectRow = val;
    },
    getSelectIds() {
      const ids = [];
      this.selectRow.forEach(item => {
        if (this.isVehicle) {
          ids.push(item.vehicleModelId)
        } else {
          ids.push(item.sitePk)
        }
      })
      return ids;
    },
    onClickAssign() {
      if (this.isVehicle) {
        this.assignVehicles();
      } else {
        this.assignSites();
      }
    },
    onClickUnassign() {
      if (this.isVehicle) {
        this.unassignVehicles();
      } else {
        this.unassignSites();
      }
    },
    assignSites() {
      const params = {
        dynamicPointsId: this.pointsId,
        sitePks: this.getSelectIds()
      }
      this.loading.assign = true;
      points.assignPointsSites(params).then(res => {
        this.$message({
          type: 'success',
          message: res.msg || "Success"
        })
        this.getTableData()
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
      }).finally(() => {
        this.loading.assign = false;
      })
    },
    unassignSites() {
      const params = {
        dynamicPointsId: this.pointsId,
        sitePks: this.getSelectIds()
      }
      this.loading.unassign = true;
      points.unassignPointsSites(params).then(res => {
        this.$message({
          type: 'success',
          message: res.msg || "Success"
        })
        this.getTableData()
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
      }).finally(() => {
        this.loading.unassign = false;
      })
    },
    assignVehicles() {
      const params = {
        dynamicPointsId: this.pointsId,
        vehicleModelIds: this.getSelectIds()
      }
      this.loading.assign = true;
      points.assignPointsVehicleModel(params).then(res => {
        this.$message({
          type: 'success',
          message: res.msg || "Success"
        })
        this.getTableData()
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
      }).finally(() => {
        this.loading.assign = false;
      })
    },
    unassignVehicles() {
      const params = {
        dynamicPointsId: this.pointsId,
        vehicleModelIds: this.getSelectIds()
      }
      this.loading.unassign = true;
      points.unassignPointsVehicleModel(params).then(res => {
        this.$message({
          type: 'success',
          message: res.msg || "Success"
        })
        this.getTableData()
      }).catch(error => {
        this.$message({
          type: 'error',
          message: error
        })
      }).finally(() => {
        this.loading.unassign = false;
      })
    }
  }
}
</script>

<style scoped>
  >>> .points-assign-dialog {
    width: 65vw;
    height: 90vh;
    display: flex;
    max-width: 1200px;
    flex-direction: column;
    margin-top: 5vh !important;
  }
  >>> .points-assign-dialog .el-dialog__header {
    padding: 20px 20px 0;
    font-weight: bold;
  }
  >>> .points-assign-dialog .el-dialog__body {
    flex: 1;
    padding: 20px;
    display: flex;
    overflow: hidden;
    flex-direction: column;
  }
  .assign-table-actions {
    display: flex;
    padding-top: 5px;
    flex-wrap: wrap-reverse;
    align-items: center;
    justify-content: flex-end;
  }
  .points-assign-dialog .table-view {
    flex: 1;
    overflow-y: auto;
    padding-top: 10px;
    margin-bottom: -10px;
  }
  @media screen and (max-width: 1200px) {
    .points-assign-dialog {
      width: 70vw;
    }
  }
  @media screen and (max-width: 1000px) {
    .points-assign-dialog {
      width: 80vw;
    }
  }
  @media screen and (max-width: 800px) {
    .points-assign-dialog {
      width: 90vw;
    }
  }
  @media screen and (max-width: 700px) {
    .points-assign-dialog {
      width: 99vw;
    }
  }
  @media screen and (max-width: 320px) {
    .points-assign-dialog {
      width: 100%;
      min-width: 300px;
    }
  }
</style>