<script setup lang="ts">
import { ref, onMounted, computed } from "vue";
import { useQuasar } from "quasar";
import { useRouter } from "vue-router";
import { useCounterMixin } from "@/stores/mixin";
import { useRetirementDataStore } from "@/modules/06_retirement/store";
import DialogHeader from "@/modules/06_retirement/components/DialogHeader.vue";

import http from "@/plugins/http";
import config from "@/app.config";

import type { QTableProps } from "quasar";
import type { ResponseItems } from "@/modules/06_retirement/interface/response/Main";

const $q = useQuasar(); //ใช้ noti quasar
const router = useRouter();
const mixin = useCounterMixin();
const RetirementData = useRetirementDataStore();

const { messageError, date2Thai, showLoader, hideLoader, success } = mixin;
const { statusText } = RetirementData;

const rows = ref<ResponseItems[]>([]);
const columns = ref<QTableProps["columns"]>([
  {
    name: "no",
    align: "left",
    label: "ลำดับ",
    sortable: true,
    field: "no",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "prefix",
    align: "left",
    label: "คำนำหน้า",
    sortable: true,
    field: "prefix",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "fullname",
    align: "left",
    label: "ชื่อ-นามสกุล",
    sortable: true,
    field: "fullname",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "location",
    align: "left",
    label: "สถานที่ยื่นขอลาออกจากราชการ",
    sortable: true,
    field: "location",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "positionTypeOld",
    align: "left",
    label: "ตำแหน่งในสายงาน",
    sortable: true,
    field: "positionTypeOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "positionLevelOld",
    align: "left",
    label: "ระดับ",
    sortable: true,
    field: "positionLevelOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "positionNumberOld",
    align: "left",
    label: "เลขที่",
    sortable: true,
    field: "positionNumberOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "organizationPositionOld",
    align: "left",
    label: "สังกัด",
    sortable: true,
    field: "organizationPositionOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "datetext",
    align: "left",
    label: "วันที่ดำเนินการ",
    sortable: true,
    field: "datetext",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
    sortOrder: "da",
  },
  {
    name: "statustext",
    align: "left",
    label: "สถานะ",
    sortable: true,
    field: "statustext",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
]);
const visibleColumns = ref<string[]>([
  "no",
  "prefix",
  "fullname",
  "location",
  "positionTypeOld",
  "positionLevelOld",
  "positionNumberOld",
  "organizationPositionOld",
  "datetext",
  "statustext",
]);

const filters = ref<ResponseItems[]>([]);
const rows2 = ref<ResponseItems[]>([]);
const columns2 = ref<QTableProps["columns"]>([
  {
    name: "no",
    align: "left",
    label: "ลำดับ",
    sortable: true,
    field: "no",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "prefix",
    align: "left",
    label: "คำนำหน้า",
    sortable: true,
    field: "prefix",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "fullname",
    align: "left",
    label: "ชื่อ-นามสกุล",
    sortable: true,
    field: "fullname",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },

  {
    name: "positionTypeOld",
    align: "left",
    label: "ตำแหน่งในสายงาน",
    sortable: true,
    field: "positionTypeOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "positionLevelOld",
    align: "left",
    label: "ระดับ",
    sortable: true,
    field: "positionLevelOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "positionNumberOld",
    align: "left",
    label: "เลขที่",
    sortable: true,
    field: "positionNumberOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "organizationPositionOld",
    align: "left",
    label: "สังกัด",
    sortable: true,
    field: "organizationPositionOld",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
  {
    name: "datetext",
    align: "left",
    label: "วันที่ดำเนินการ",
    sortable: true,
    field: "datetext",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
    sortOrder: "da",
  },
  {
    name: "statustext",
    align: "left",
    label: "สถานะ",
    sortable: true,
    field: "statustext",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
    sort: (a: string, b: string) =>
      a.localeCompare(b, undefined, { numeric: true, sensitivity: "base" }),
  },
]);
const visibleColumns2 = ref<string[]>([
  "no",
  "prefix",
  "fullname",
  "positionTypeOld",
  "positionLevelOld",
  "positionNumberOld",
  "organizationPositionOld",
  "datetext",
  "statustext",
]);

const modal = ref<boolean>(false);
const filterKeyword2 = ref<string>("");
//ค้นหา คอลัมน์ คอลัมน์ที่แสดง
const filterKeyword = ref<string>("");
const filterRef = ref<any>(null);

const openModal = () => (modal.value = true);
const closeModal = () => (modal.value = false);

const selected = ref<ResponseItems[]>([]);
const checkSelected = computed(() => {
  if (selected.value.length === 0) {

    return true;
  }
});

const resetFilter = () => {
  filterKeyword.value = "";
  filterRef.value.focus();
};

const openModalOrder = () => {

  openModal();
  const row = filters.value.filter(
    (r: ResponseItems) =>
      r.status == "PENDING" || r.status == "APPROVE" || r.status == "REJECT"
  );
  rows2.value = row;

};

onMounted(async () => {
  await fecthlist();
});

const fecthlist = async () => {
  showLoader();
  await http
    .get(config.API.listResign())
    .then((res: any) => {
      const data = res.data.result;
      let list: ResponseItems[] = [];

      data.map((r: ResponseItems) => {
        list.push({
          datetext:
            r.createdAt == null ? "-" : date2Thai(new Date(r.createdAt)),
          activeDate: new Date(),
          createdAt: new Date(r.createdAt),
          firstName: r.firstName ?? "",
          id: r.id ?? "",
          isActive: r.isActive ? r.isActive : false,
          lastName: r.lastName ?? "",
          location: r.location ?? "",
          organizationPositionOld: r.organizationPositionOld ?? "",
          positionLevelOld: r.positionLevelOld ?? "",
          positionNumberOld: r.positionNumberOld ?? "",
          positionTypeOld: r.positionTypeOld ?? "",
          prefix: r.prefix ?? "",
          profileId: r.profileId ?? "",
          reason: r.reason ?? "",
          salary: r.salary ? r.salary : 0,
          sendDate: new Date(),
          status: r.status ?? "",
          statustext: status(r.status ?? ""),
          fullname: `${r.firstName ?? ""} ${r.lastName ?? ""}`,
        });
      });

      rows.value = list;
      filters.value = list;
    })
    .catch((e: any) => {
      messageError($q, e);
    })
    .finally(() => {
      hideLoader();
    });
};

const saveOrder = async () => {
  const id = selected.value.map((r) => r.id);
  const body = {
    id,
  };

  showLoader();
  await http
    .post(config.API.resignReport, body)
    .then((res: any) => {
      //   const data = res.data.result;
      //   console.log(data);
      success($q, "ส่งไปออกคำสั่งลาออกสำเร็จ");
      closeModal();
    })
    .catch((e) => {
      messageError($q, e);
    })
    .finally(async () => {
      await fecthlist();
      hideLoader();
    });
};
const status = (val: string) => {
  switch (val) {
    case "WAITTING":
      return "รอดำเนินการ";
    case "PENDING":
      return "เลือกตำแหน่งแล้ว";
    case "APPROVE":
      return "อนุมัติ";
    case "REJECT":
      return "ยับยั้ง";
    case "DELETE":
      return "ยกเลิกการลาออก";
    case "REPORT":
      return "ส่งรายชื่อไปออกคำสั่ง";
    case "DONE":
      return "ออกคำสั่งเสร็จแล้ว";
    default:
      return "-";
  }
};
</script>
<template>
  <div class="toptitle text-dark col-12 row items-center">รายการลาออก</div>
  <q-card flat bordered class="col-12 q-mt-sm">
    <q-separator />
    <div class="col-12 row q-pa-md">
      <div class="row col-12">
        <div class="row col-12 q-col-gutter-sm">
          <q-btn @click="openModalOrder" size="14px" flat round color="add" icon="mdi-account-arrow-right">
            <q-tooltip>ส่งไปออกคำสั่งลาออก</q-tooltip>
          </q-btn>

          <q-space />

          <q-input class="col-xs-12 col-sm-3 col-md-2" standout dense v-model="filterKeyword" ref="filterRef" outlined
            debounce="300" placeholder="ค้นหา">
            <template v-slot:append>
              <q-icon v-if="filterKeyword == ''" name="search" />
              <q-icon v-if="filterKeyword !== ''" name="clear" class="cursor-pointer" @click="resetFilter" />
            </template>
          </q-input>

          <q-select v-model="visibleColumns" multiple outlined dense options-dense :display-value="$q.lang.table.columns"
            emit-value map-options :options="columns" option-value="name" options-cover style="min-width: 150px"
            class="col-xs-12 col-sm-3 col-md-2" />
        </div>
        <div class="col-12 q-pt-sm">
          <d-table :columns="columns" :rows="rows" :filter="filterKeyword" row-key="id" :visible-columns="visibleColumns">
            <template v-slot:header="props">
              <q-tr :props="props">
                <q-th v-for="col in props.cols" :key="col.name" :props="props">
                  <span class="text-weight-medium">{{ col.label }}</span>
                </q-th>
              </q-tr>
            </template>
            <template v-slot:body="props">
              <q-tr :props="props" class="cursor-pointer" @click="router.push(`/retirement/resign/${props.row.id}`)">
                <q-td key="no" :props="props">
                  {{ props.rowIndex + 1 }}
                </q-td>
                <q-td key="prefix" :props="props">
                  {{ props.row.prefix }}
                </q-td>
                <q-td key="fullname" :props="props">
                  {{ props.row.fullname }}
                </q-td>
                <q-td key="location" :props="props">
                  {{ props.row.location }}
                </q-td>
                <q-td key="positionTypeOld" :props="props">
                  {{ props.row.positionTypeOld }}
                </q-td>
                <q-td key="positionLevelOld" :props="props">
                  {{ props.row.positionLevelOld }}
                </q-td>
                <q-td key="positionNumberOld" :props="props">
                  {{ props.row.positionNumberOld }}
                </q-td>

                <q-td key="organizationPositionOld" :props="props">
                  <div class="table_ellipsis">
                    {{ props.row.organizationPositionOld }}
                  </div>
                </q-td>
                <q-td key="datetext" :props="props">
                  {{ props.row.datetext }}
                </q-td>
                <q-td key="statustext" :props="props">
                  {{ props.row.statustext }}
                </q-td>
              </q-tr>
            </template>
          </d-table>
        </div>
      </div>
    </div>
  </q-card>

  <q-dialog v-model="modal">
    <q-card style="width: 1200px; max-width: 80vw">
      <DialogHeader title="ส่งไปออกคำสั่ง" :close="closeModal" />
      <q-separator />
      <q-card-section class="q-pt-none">
        <div class="row justify-end">
          <div class="col-5">
            <q-toolbar style="padding: 0">

              <q-input borderless outlined dense debounce="300" v-model="filterKeyword2" placeholder="ค้นหา"
                style="width: 850px; max-width: auto">
                <template v-slot:append>
                  <q-icon v-if="filterKeyword2 == ''" name="search" />
                  <q-icon v-if="filterKeyword2 !== ''" name="clear" class="cursor-pointer" @click="resetFilter" />
                </template>
              </q-input>
              <q-select v-model="visibleColumns2" multiple outlined dense options-dense
                :display-value="$q.lang.table.columns" emit-value map-options :options="columns2" option-value="name"
                options-cover style="min-width: 150px" class="gt-xs q-ml-sm" />
            </q-toolbar>
          </div>
        </div>

        <d-table :columns="columns2" :rows="rows2" :filter="filterKeyword2" row-key="id"
          :visible-columns="visibleColumns2" selection="multiple" v-model:selected="selected">
          <template v-slot:header-selection="scope">
            <q-checkbox keep-color color="primary" dense v-model="scope.selected" />
          </template>

          <template v-slot:body="props">
            <q-tr :props="props" class="cursor-pointer">
              <q-td>
                <q-checkbox keep-color color="primary" dense v-model="props.selected" />
              </q-td>
              <q-td key="no" :props="props">
                {{ props.rowIndex + 1 }}
              </q-td>
              <q-td key="prefix" :props="props">
                {{ props.row.prefix }}
              </q-td>
              <q-td key="fullname" :props="props">
                {{ props.row.fullname }}
              </q-td>
              <q-td key="positionTypeOld" :props="props">
                {{ props.row.positionTypeOld }}
              </q-td>
              <q-td key="positionLevelOld" :props="props">
                {{ props.row.positionLevelOld }}
              </q-td>
              <q-td key="positionNumberOld" :props="props">
                {{ props.row.positionNumberOld }}
              </q-td>

              <q-td key="organizationPositionOld" :props="props">
                <div class="table_ellipsis">
                  {{ props.row.organizationPositionOld }}
                </div>
              </q-td>
              <q-td key="datetext" :props="props">
                {{ props.row.datetext }}
              </q-td>
              <q-td key="statustext" :props="props">
                {{ props.row.statustext }}
              </q-td>
            </q-tr>
          </template>
        </d-table>
      </q-card-section>

      <q-card-actions align="right" class="bg-white text-teal">
        <q-btn label="ส่งไปออกคำสั่ง" @click="saveOrder" :disable="checkSelected" color="public" />
      </q-card-actions>
    </q-card>
  </q-dialog>
</template>
<style scoped lang="scss"></style>
