<script setup lang="ts">
import { ref, onMounted, computed, watch } from "vue";
import AddList from "../ListRetirement/AddList.vue";
import { useCounterMixin } from "@/stores/mixin";
import { useQuasar, QForm } from "quasar";
import { useRoute } from "vue-router";
import { useRouter } from "vue-router";
import http from "@/plugins/http";
import config from "@/app.config";
import DialogHeader from "@/components/DialogHeader.vue";
import DialogPopupReason from "@/components/Dialogs/PopupReason.vue";

/** Use */
const route = useRoute();
const router = useRouter();
const $q = useQuasar();
const mixin = useCounterMixin();
const {
  showLoader,
  hideLoader,
  messageError,
  success,
  dialogConfirm,
  dialogRemove,
  date2Thai,
  dateToISO,
} = mixin;
const myForm = ref<QForm | null>(null);

/** ตัวแปร  */
const retireld_params = route.params.retirementId;
const modalNote = ref<boolean>(false);
const note = ref<string>("");
const retireProfileId = ref<string>("");
const retireld = ref<string>(retireld_params.toString());
const profileId = ref<string>("");
const filter = ref<string>("");
const statusUpload = ref<boolean>();
const modalEdit = ref<boolean>(false);
const textReport = ref<string>("");
const employeeType = ref<string>("OFFICER");
const action = ref<string>("");
const fileUpload = ref<any>(null);
const round = ref<number>();
const typeReport = ref<string>("");
const statusReport = ref<boolean>();
const dataProfile = ref<Object>([]);

/** คอลัมน์ที่แสดง */
const columns = ref<any["columns"]>([]);
const rows = ref<any>([]);
const visibleColumns = ref<string[]>([
  "order",
  "name",
  "organizationOrganization",
  "positionEmployeePosition",
  "positionEmployeeLevel",
  "positionEmployeeGroup",
  "organizationAgency",
  "organizationGovernmentAgency",
  "positionNumber",
  "govGroup",
  "govOffice",
  "bureau",
]);

/** Hook */
onMounted(() => {
  retireld.value = retireld_params.toString();
  fecthlistprofile(retireld.value);
});

/**
 * ฟังก์ชั่นปิด Dialog
 */
const closeDialog = () => {
  modalNote.value = false;
  modalUpload.value = false;
};

// fecthlist
const fecthlistprofile = async (id: string) => {
  showLoader();
  await http
    .get(config.API.listRetire(id))
    .then((res) => {
      dataProfile.value = res.data.result;
      round.value = res.data.result.round;
      statusReport.value = res.data.result.json;
      typeReport.value = res.data.result.typeReport;
      textReport.value = res.data.result.detail;
      employeeType.value = res.data.result.type;

      // รายชื่อผู้เกษียณอายุราชการ
      rows.value = res.data.result.profile.map((e: any) => ({
        id: e.id,
        profileId: e.profileId,
        order: e.order,
        name: e.fullName,
        organizationOrganization: e.organizationOrganization,
        positionEmployeePosition:
          res.data.result.type == "OFFICER"
            ? e.positionType
            : e.positionEmployeePosition,
        positionEmployeeLevel:
          res.data.result.type == "OFFICER"
            ? e.positionExecutive != null
              ? e.positionExecutive
              : "-"
            : e.positionEmployeeLevel,
        positionNumber:
          res.data.result.type == "OFFICER" ? e.posNo : e.posNoEmployee,
        positionEmployeeGroup:
          res.data.result.type == "OFFICER"
            ? e.position
            : e.positionEmployeeGroup,
        organizationAgency: e.organizationAgency,
        organizationGovernmentAgency: e.organizationGovernmentAgency,
        bureau: e.oc,
        reason: e.reason,
        remove: e.remove,
      }));
      if (statusReport.value == false) {
        fecthCheck(retireld.value);
      } else statusUpload.value = true;
    })
    .catch((e) => {
      messageError($q, e);
    })
    .finally(() => {
      //คอลัมน์
      columns.value = [
        {
          name: "order",
          label: "ลำดับ",
          title: "ลำดับ",
          field: "order",
          align: "left",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "name",
          align: "left",
          label: "ชื่อ - นามสกุล",
          title: "ชื่อ - นามสกุล",
          field: "name",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "organizationOrganization",
          align: "left",
          label: "สังกัด",
          title: "สังกัด",
          field: "organizationOrganization",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "positionEmployeeGroup",
          align: "left",
          label:
            employeeType.value == "OFFICER"
              ? "ตำแหน่ง (ในสายงาน/ระดับ)"
              : "กลุ่มงาน",
          title: employeeType.value == "OFFICER" ? "ตำแหน่ง" : "กลุ่มงาน",
          subtitle: employeeType.value == "OFFICER" ? "ในสายงาน/ระดับ" : "",
          field: "positionEmployeeGroup",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "positionEmployeePosition",
          align: "left",
          label:
            employeeType.value == "OFFICER" ? "ตำแหน่ง (ประเภท)" : "ตำแหน่ง",
          title: employeeType.value == "OFFICER" ? "ตำแหน่ง" : "ตำแหน่ง",
          subtitle: employeeType.value == "OFFICER" ? "ประเภท" : "",
          field: "positionEmployeePosition",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "positionEmployeeLevel",
          align: "left",
          label:
            employeeType.value == "OFFICER"
              ? "ตำแหน่ง (ทางการบริหาร)"
              : "ระดับชั้น",
          title: employeeType.value == "OFFICER" ? "ตำแหน่ง" : "ระดับชั้น",
          subtitle: employeeType.value == "OFFICER" ? "ทางการบริหาร" : "",
          field: "positionEmployeeLevel",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },

        {
          name: "positionNumber",
          align: "left",
          label: "ตำแหน่ง (เลขที่) ",
          title: "ตำแหน่ง",
          subtitle: "เลขที่",
          field: "positionNumber",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "organizationAgency",
          align: "left",
          label: "ส่วนราชการ (ระดับฝ่าย/กลุ่มงาน/ส่วน)",
          title: "ส่วนราชการ",
          subtitle: "ระดับฝ่าย/กลุ่มงาน/ส่วน",
          field: "organizationAgency",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "organizationGovernmentAgency",
          align: "left",
          label: "ส่วนราชการ (ระดับสถาบัน/สำนักงาน/กอง)",
          title: "ส่วนราชการ",
          subtitle: "ระดับสถาบัน/สำนักงาน/กอง",
          field: "organizationGovernmentAgency",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
        {
          name: "bureau",
          align: "left",
          label: "หน่วยงาน",
          title: "หน่วยงาน",
          field: "bureau",
          headerStyle: "font-size: 14px",
          style: "font-size: 14px",
        },
      ];

      hideLoader();
    });
};

// เช็คสถานะการอัพโหลด
const fecthCheck = async (id: string) => {
  await http
    .get(config.API.checkfileupload(id))
    .then((res) => {
      statusUpload.value = res.data.result;
    })
    .catch((err) => {
      messageError($q, err);
    });
};

// DelProfile
const clickDelete = () => {
  dialogRemove(
    $q,
    async () => {
      await http
        .post(config.API.removeProfile(), {
          retireProfileId: retireProfileId.value,
          reason: note.value,
        })
        .then(() => {
          success($q, "ลบข้อมูลสำเร็จ");
        })
        .catch((e) => {
          messageError($q, e);
        })
        .finally(async () => {
          retireld.value = retireld_params.toString();
          await fecthlistprofile(retireld.value);
          modalNote.value = false;
        });
    },
    "ยืนยันการลบข้อมูล",
    "ต้องการลบข้อมูลนี้ใช่หรือไม่ ?"
  );
};

// แก้ไข้ข้อมูล
const saveNote = () => {
  dialogConfirm(
    $q,
    async () => {
      await http
        .post(config.API.createnote(), {
          retireProfileId: retireProfileId.value,
          reason: note.value,
        })
        .then(() => {
          success($q, "บันทึกข้อมูลสำเร็จ");
        })
        .catch((e) => {
          messageError($q, e);
        })
        .finally(async () => {
          retireld.value = retireld_params.toString();
          fecthlistprofile(retireld.value);
          modalNote.value = false;
        });
    },
    "ยืนยันการบันทึกข้อมูล",
    "ต้องการบันทึกข้อมูลนี้ใช่หรือไม่ ?"
  );
};

//อัพเดท ListId
const UpdateListId = (retireld: string, pId: string) => {
  profileId.value = pId;
  fecthlistprofile(retireld);
};

// กลับหน้าเดิม
const backHistory = () => {
  window.history.back();
};

const visibleNote = computed(() => {
  if (note.value === "" || note.value === undefined) {
    return true;
  }
});

// อัปโหลดไฟล์
const modalUpload = ref<boolean>(false);
const signDate = ref<Date | null>(null);
const uploadFile = async (event: any, signDate: any) => {
  if (myForm.value !== null) {
    myForm.value.validate().then((successmyForm) => {
      if (successmyForm) {
        dialogConfirm(
          $q,
          async () => {
            showLoader();
            const selectedFile = event;
            const formdata = new FormData();
            formdata.append("file", selectedFile);
            if (signDate != null)
              formdata.append("signDate", dateToISO(signDate));
            await http
              .put(
                config.API.fileRetirement(retireld.value.toString()),
                formdata
              )
              .then(() => {
                success($q, "เพิ่มไฟล์สำเร็จ");
              })
              .catch((err) => {
                messageError($q, err);
              })
              .finally(() => {
                fileUpload.value = null;
                signDate.value = null;
                modalUpload.value = false;
                fecthlistprofile(retireld.value);
                fecthCheck(retireld.value);
                hideLoader();
              });
          },
          "ยืนยันการอัปโหลดเอกสาร",
          "ต้องการยืนยันการอัปโหลดเอกสารนี้หรือไม่ ?"
        );
      }
    });
  }
};

// downloadAttachment
const downloadAttachment = async (type: string, id: string) => {
  showLoader();
  await http
    .get(config.API.reportRetireList(type, id), {
      responseType: "blob",
    })
    .then(async (res) => {
      downloadFile(res, `${"รายชื่อผู้เกษียณอายุราชการ"}.${type}`);
    })
    .catch((e) => {
      messageError($q, e);
    })
    .finally(() => {
      hideLoader();
    });
};

// downloadFile
const downloadFile = (response: any, filename: string) => {
  const link = document.createElement("a");
  var fileName = filename;
  link.href = window.URL.createObjectURL(new Blob([response.data]));
  link.setAttribute("download", fileName);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};

// ยืนยันการแก้ไขข้อมูล
const saveEdiitReport = (reason: string) => {
  const formdata = new FormData();
  formdata.append("Detail", reason);
  dialogConfirm(
    $q,
    async () => {
      await http
        .put(config.API.editDetail(retireld.value), formdata)
        .then(() => {
          success($q, "แก้ไขข้อความสำเร็จ");
        })
        .catch((err) => {
          messageError($q, err);
        })
        .finally(() => {
          fecthlistprofile(retireld.value);
          closemodalEditReport();
        });
    },
    "ยืนยันการแก้ไขข้อมูล",
    "ต้องการยืนยันการแก้ไขข้อมูลนี้หรือไม่ ?"
  );
};

// เปิด popup เหตุผล
const openmodalEditReport = () => {
  modalEdit.value = true;
};

// ปิด popup เหตุผล
const closemodalEditReport = () => {
  modalEdit.value = false;
};

/** Setting Pagination */
const paging = ref<boolean>(true);
const pagination = ref({
  sortBy: "order",
  descending: false,
  page: 1,
  rowsPerPage: 10,
});
const paginationLabel = (start: number, end: number, total: number) => {
  if (paging.value == true) return " " + start + "-" + end + " ใน " + total;
  else return start + "-" + end + " ใน " + total;
};
</script>

<template>
  <div class="toptitle text-dark col-12 row items-center">
    <q-btn
      icon="mdi-arrow-left"
      unelevated
      round
      dense
      flat
      color="primary"
      class="q-mr-sm"
      @click="backHistory"
    />
    รายชื่อผู้เกษียณอายุราชการ
  </div>
  <div>
    <q-card class="col-12 q-pa-md">
      <div class="row col-12 q-pb-sm">
        <div class="row">
          <AddList
            :dataProfile="dataProfile"
            :retireld="retireld"
            :profile-id="profileId"
            :UpdateListId="UpdateListId"
            v-if="
              statusReport === false &&
              (typeReport == 'ADD' || typeReport == '' || typeReport == null) &&
              statusUpload !== true
            "
          />
          <q-btn color="primary" flat round icon="mdi-dots-vertical">
            <q-menu>
              <q-list style="min-width: 100px">
                <q-item
                  clickable
                  v-close-popup
                  type="a"
                  @click="
                    (modalUpload = true), (signDate = null), (fileUpload = null)
                  "
                  target="_blank"
                  v-if="statusUpload !== true"
                >
                  <q-item-section avatar
                    ><q-icon color="blue" name="attach_file"
                  /></q-item-section>
                  <q-item-section>อัปโหลดไฟล์ </q-item-section>
                </q-item>
                <q-item
                  clickable
                  v-close-popup
                  type="a"
                  @click="openmodalEditReport()"
                  target="_blank"
                >
                  <q-item-section avatar
                    ><q-icon color="primary" name="mdi-pencil"
                  /></q-item-section>
                  <q-item-section>แก้ไข มติ อ.ก.ก. </q-item-section>
                </q-item>
                <q-separator />
                <q-item
                  clickable
                  v-close-popup
                  type="a"
                  @click="downloadAttachment('pdf', retireld)"
                  target="_blank"
                >
                  <q-item-section avatar
                    ><q-icon color="red" name="mdi-file-pdf"
                  /></q-item-section>
                  <q-item-section>ไฟล์ .PDF</q-item-section>
                </q-item>
                <q-item
                  clickable
                  v-close-popup
                  type="a"
                  @click="downloadAttachment('docx', retireld)"
                  target="_blank"
                >
                  <q-item-section avatar
                    ><q-icon color="blue" name="mdi-file-word"
                  /></q-item-section>
                  <q-item-section>ไฟล์ .docx</q-item-section>
                </q-item>
              </q-list>
            </q-menu>
            <q-tooltip>ดาวน์โหลดไฟล์</q-tooltip>
          </q-btn>
          <!-- <q-file
            bg-color="white"
            clearable
            outlined
            dense
            v-model="fileUpload"
            accept=".pdf"
            :style="fileUpload === null ? 'width: 150px' : 'width: auto'"
            label="อัปโหลดไฟล์"
            v-if="statusUpload !== true"
          >
            <template v-slot:prepend>
              <q-icon color="light-blue" name="attach_file" />
              <q-tooltip>อัปโหลดไฟล์</q-tooltip>
            </template>
          </q-file> -->
        </div>
        <q-space />
        <div class="row">
          <q-tabs shrink>
            <q-input
              borderless
              outlined
              dense
              debounce="300"
              v-model="filter"
              placeholder="ค้นหา"
              style="max-width: 200px"
              class="q-ml-sm"
            >
              <template v-slot:append>
                <q-icon name="search" />
              </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="gt-xs q-ml-sm"
            >
            </q-select>
          </q-tabs>
        </div>
      </div>

      <div>
        <q-table
          flat
          dense
          bordered
          :rows="rows"
          :columns="columns"
          row-key="order"
          class="custom-header-table"
          :filter="filter"
          :visible-columns="visibleColumns"
          no-data-label="ไม่มีข้อมูล"
          :pagination-label="paginationLabel"
          v-model:pagination="pagination"
        >
          <template v-slot:header="props">
            <q-tr :props="props">
              <q-th v-for="col in props.cols" :key="col.name" :props="props">
                <div class="text-grey-7 text-weight-medium">
                  <span class="row">{{ col.title }}</span>
                  <span class="row" style="font-size: 12px">{{
                    col.subtitle
                  }}</span>
                </div>
              </q-th>
              <q-th auto-width />
              <q-th
                auto-width
                v-if="
                  (typeReport === 'EDIT' ||
                    typeReport === null ||
                    typeReport === '') &&
                  statusReport === false &&
                  statusUpload !== true
                "
              />
              <q-th auto-width v-else></q-th>
              <q-th
                auto-width
                v-if="
                  (typeReport === 'REMOVE' ||
                    typeReport === null ||
                    typeReport === '') &&
                  statusReport === false &&
                  statusUpload !== true
                "
              />
              <q-th auto-width v-else></q-th>
            </q-tr>
          </template>
          <template v-slot:body="props">
            <q-tr
              :props="props"
              class="cursor-pointer"
              :style="props.row.profileId === profileId && 'color: #26a69a;'"
              @click.stop="router.push(`/registry/${props.row.profileId}`)"
            >
              <q-td key="order" :props="props">{{ props.row.order }} </q-td>
              <q-td key="name" :props="props">{{ props.row.name }}</q-td>
              <q-td
                class="table_ellipsis"
                key="organizationOrganization"
                :props="props"
                >{{ props.row.organizationOrganization }}</q-td
              >
              <q-td key="positionEmployeeGroup" :props="props">{{
                props.row.positionEmployeeGroup
              }}</q-td>
              <q-td key="positionEmployeePosition" :props="props">{{
                props.row.positionEmployeePosition
              }}</q-td>
              <q-td key="positionEmployeeLevel" :props="props">{{
                props.row.positionEmployeeLevel
              }}</q-td>

              <q-td key="positionNumber" :props="props">{{
                props.row.positionNumber
              }}</q-td>
              <q-td key="organizationAgency" :props="props">{{
                props.row.organizationAgency
              }}</q-td>
              <q-td key="organizationGovernmentAgency" :props="props">{{
                props.row.organizationGovernmentAgency
              }}</q-td>
              <q-td class="table_ellipsis" key="bureau" :props="props">{{
                props.row.bureau
              }}</q-td>
              <q-td auto-width></q-td>
              <q-td
                auto-width
                v-if="
                  (typeReport === 'EDIT' ||
                    typeReport === null ||
                    typeReport === '') &&
                  statusReport === false &&
                  statusUpload !== true
                "
              >
                <q-btn
                  flat
                  round
                  color="primary"
                  icon="mdi-pencil"
                  dense
                  @click.stop="
                    (modalNote = true),
                      (note = props.row.reason),
                      (action = 'edit'),
                      (retireProfileId = props.row.id)
                  "
                >
                  <q-tooltip>กรอกเหตุผล</q-tooltip>
                </q-btn>
              </q-td>
              <q-td auto-width v-else></q-td>
              <q-td
                auto-width
                v-if="
                  (typeReport === 'REMOVE' ||
                    typeReport === null ||
                    typeReport === '') &&
                  statusReport === false &&
                  statusUpload !== true
                "
              >
                <q-btn
                  flat
                  round
                  class="text-red-14"
                  icon="mdi-delete"
                  dense
                  @click.stop="
                    (modalNote = true),
                      (action = 'delete'),
                      (note = props.row.reason),
                      (retireProfileId = props.row.id)
                  "
                  ><q-tooltip>ลบข้อมูล</q-tooltip></q-btn
                >
              </q-td>
              <q-td auto-width v-else></q-td>
            </q-tr>
          </template>
          <template v-slot:pagination="scope">
            <q-pagination
              v-model="pagination.page"
              color="primary"
              :max="scope.pagesNumber"
              :max-pages="5"
              size="sm"
              boundary-links
              direction-links
            ></q-pagination>
          </template>
        </q-table>
      </div>
    </q-card>
  </div>

  <!-- note -->
  <q-dialog v-model="modalNote">
    <q-card style="width: 50vw">
      <DialogHeader tittle="กรอกเหตุผล" :close="closeDialog" />
      <q-separator />
      <q-card-section class="q-pt-none bg-grey-1">
        <div class="row q-col-gutter-sm">
          <div class="col-12">
            <q-input
              outlined
              dense
              lazy-rules
              v-model="note"
              :rules="[(val) => !!val || 'กรุณากรอกเหตุผล']"
              :label="`${'กรอกเหตุผล'}`"
              type="textarea"
            />
          </div>
        </div>
      </q-card-section>

      <q-card-actions align="right">
        <q-btn
          v-if="action === 'delete'"
          label="บันทึก"
          color="secondary"
          :disable="visibleNote"
          @click="clickDelete"
        />
        <q-btn
          v-else
          label="บักทึก"
          color="secondary"
          @click="saveNote"
          :disable="visibleNote"
        />
      </q-card-actions>
    </q-card>
  </q-dialog>

  <!-- อัปโหลดไฟล์ -->
  <q-dialog v-model="modalUpload">
    <q-card style="width: 50vw">
      <DialogHeader tittle="อัปโหลดเอกสาร" :close="closeDialog" />
      <q-separator />
      <q-card-section>
        <q-form ref="myForm">
          <div class="row q-pa-md q-gutter-md">
            <div class="col-12">
              <q-file
                bg-color="white"
                clearable
                outlined
                dense
                v-model="fileUpload"
                accept=".pdf"
                label="อัปโหลดเอกสาร"
                :rules="[(val) => !!val || `${'กรุณาเลือกเอกสารอัปโหลด'}`]"
                lazy-rules
              >
                <template v-slot:prepend>
                  <q-icon color="light-blue" name="attach_file" />
                  <q-tooltip>อัปโหลดไฟล์</q-tooltip>
                </template>
              </q-file>
            </div>
            <div class="col-12">
              <datepicker
                menu-class-name="modalfix"
                v-model="signDate"
                :locale="'th'"
                autoApply
                :enableTimePicker="false"
                week-start="0"
              >
                <template #year="{ year }">{{ year + 543 }}</template>
                <template #year-overlay-value="{ value }">{{
                  parseInt(value + 543)
                }}</template>
                <template #trigger>
                  <q-input
                    dense
                    outlined
                    :rules="[(val) => !!val || `${'กรุณาเลือกวันที่'}`]"
                    lazy-rules
                    :model-value="
                      signDate !== null ? date2Thai(signDate) : null
                    "
                    hide-bottom-space
                    :label="`${'ประกาศ ณ วันที่'}`"
                  >
                    <template v-slot:prepend>
                      <q-icon name="event" class="cursor-pointer text-primary">
                      </q-icon>
                    </template>
                  </q-input>
                </template>
              </datepicker>
            </div>
          </div>
        </q-form>
      </q-card-section>
      <q-separator />
      <q-card-actions align="right">
        <q-btn
          flat
          round
          color="public"
          icon="mdi-content-save-outline"
          @click="uploadFile(fileUpload, signDate)"
        >
          <q-tooltip>บันทึก</q-tooltip>
        </q-btn>
      </q-card-actions>
    </q-card>
  </q-dialog>

  <DialogPopupReason
    :modal="modalEdit"
    title="แก้ไขมติ อ.ก.ก."
    label="มติ อ.ก.ก."
    :click-close="closemodalEditReport"
    :savaForm="saveEdiitReport"
    :textReport="textReport"
  />
</template>

<style lang="scss" scope>
.custom-header-table {
  max-height: 64vh;

  .q-table tr:nth-child(odd) td {
    background: white;
  }

  .q-table tr:nth-child(even) td {
    background: #f8f8f8;
  }

  .q-table thead tr {
    background: #ecebeb;
  }

  .q-table thead tr th {
    position: sticky;
    z-index: 1;
  }

  .q-table thead tr:last-child th {
    top: 48px;
  }

  .q-table thead tr:first-child th {
    top: 0;
  }
}

.q-btn-dropdown__arrow {
  display: none;
}
</style>
