<script setup lang="ts">
import http from "@/plugins/http";
import config from "@/app.config";
import { onMounted, ref, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useQuasar } from "quasar";
import { useCounterMixin } from "@/stores/mixin";
import CustomComponent from "@/components/CustomDialog.vue";
import avatar from "@/assets/avatar_user.jpg";
import {
  tokenParsed,
  logout,
  getCookie,
  redirectToLandingPage,
  logoutSSO,
} from "@/plugins/auth";

import { useDataStore } from "@/stores/data";

// landing page config url
const configParam = {
  landingPageUrl: import.meta.env.VITE_URL_LANDING,
};

const route = useRoute();
const router = useRouter();

const $q = useQuasar();
const dataStore = useDataStore();

const mixin = useCounterMixin();
const {
  date2Thai,
  dialogRemove,
  showLoader,
  hideLoader,
  messageError,
  success,
  dialogConfirm,
} = mixin;

const fullname = ref<string>("");
const notiList = ref<any>([]);
const notiTrigger = ref(false);
const currentRouteName = router.currentRoute.value.name;
const tab = ref<any>(currentRouteName);
const link = ref<string>("");
const isSsoToken = ref(false);

/**
 * เรียกฟังก์ชันทั้งหมดตอนเรียกใช้ไฟล์นี้
 */
onMounted(async () => {
  await checkUser();
  await fetchTotolNotificate();
  const user = await tokenParsed();
  const SSO_TOKEN = await getCookie("SSO");
  isSsoToken.value = SSO_TOKEN === "y" ? true : false;
  fullname.value = user?.name;
});

async function checkUser() {
  await http
    .get(config.API.profilePosition())
    .then(async (res) => {
      const data = await res.data.result;
      await dataStore.getData(data);
      await dataStore.getProFileType();
      if (data.avatarName) {
        await getImg(data.profileId, data.avatarName);
      } else {
        dataStore.profileImg = avatar;
      }
    })
    .catch((err) => {
      $q.dialog({
        component: CustomComponent,
        componentProps: {
          title: "ข้อความแจ้งเตือน",
          message: err.response.data.message,
          icon: "warning",
          color: "red",
          onlycancel: true,
        },
      }).onCancel(async () => {
        showLoader();
        await logout();
        setTimeout(() => {
          hideLoader();
        }, 1000);
      });
    });
}

function getImg(id: string, pathName: string) {
  http
    .get(config.API.fileByFile("ทะเบียนประวัติ", "โปรไฟล์", id, pathName))
    .then((res) => {
      dataStore.profileImg = res.data.downloadUrl;
    })
    .catch((e) => {
      // messageError($q, e);
    })
    .finally(() => {});
}

const totalNoti = ref<number>(0);
async function fetchTotolNotificate() {
  await http
    .get(config.API.msgNotificateTotal)
    .then((res) => {
      totalNoti.value = res.data.result;
      // check user in system
    })
    .catch((err) => {
      messageError($q, err);
    });
}

const statusLoad = ref<boolean>(false);
const fetchlistNotification = async (index: number, type: string) => {
  await http
    .get(config.API.msgNotificate + `?page=${index}&pageSize=${15}`)
    .then((res: any) => {
      const data = res.data.result.data;
      totalInbox.value = res.data.result.total;
      let list: any[] = [];
      if (type === "DEL") {
        notiList.value = [];
      }
      data.map((e: any) => {
        list.push({
          id: e.id,
          sender:
            e.createdFullName == "" || e.createdFullName == null
              ? "เจ้าหน้าที่"[0]
              : e.createdFullName[0],
          body: e.body ?? "",
          timereceive: date2Thai(e.createdAt),
          isOpen: e.isOpen,
          receiveDate: e.receiveDate,
          payload: e.payload,
        });
      });
      notiList.value.push(...list);
      statusLoad.value = totalInbox.value === 0 ? true : false;
    })
    .catch((err) => {
      console.log(err);
    });
};

/**
 * logout
 * confirm ก่อนออกจากระบบ
 */
const doLogout = () => {
  dialogConfirm(
    $q,
    async () => {
      await http.post(config.API.keycloakLogSSO, { text: "ออกจากระบบ" });
      // authen with client
      await logoutSSO();
    },
    "ยืนยันการออกจากระบบ",
    "ต้องการออกจากระบบใช่หรือไม่"
  );
};

const clickDelete = async (id: string, index: number) => {
  dialogRemove($q, async () => {
    // showLoader();
    await http
      .delete(config.API.msgId(id))
      .then(() => {
        notiList.value.splice(index, 1);
        totalInbox.value--;
        totalNoti.value--;
        success($q, "ลบข้อมูลสำเร็จ");
      })
      .catch((e) => {
        messageError($q, e);
      })
      .finally(async () => {
        notiList.value.length === 12 && fetchlistNotification(1, "DEL");
        // hideLoader();
      });
  });
};

const totalInbox = ref<number>(0);
const page = ref<number>(0);
async function onLoad(index: any, done: any) {
  if (
    notiList.value.length < totalInbox.value ||
    (notiList.value.length === 0 && totalInbox.value === 0)
  ) {
    page.value++;
    setTimeout(async () => {
      await fetchlistNotification(page.value, "NOMAL");
      done();
    }, 1500);
  }
}

watch(
  () => notiTrigger.value,
  () => {
    if (!notiTrigger.value) {
      const updatedNotifications = notiList.value.map((item: any) => ({
        ...item,
        isOpen: true,
      }));
      notiList.value = updatedNotifications;
      fetchTotolNotificate();
    }
  }
);

const thaiOptions: Intl.DateTimeFormatOptions = {
  hour: "2-digit",
  minute: "2-digit",
};

const handleButtonClick = async () => {
  const currentPath = route.name;
  const queryParams = { role: "user" }; // Replace with your query parameters
  const queryString = new URLSearchParams(queryParams).toString();
  const type = await dataStore.getProFileType();
  // Assuming config.generatePopupPath() returns a base URL
  const popupBasePath = config.generatePopupPath(currentPath, type);

  if (popupBasePath) {
    const popupPath = `${popupBasePath}?${queryString}`;
    window.open(popupPath, "_blank"); // Opens in a new tab/window
  } else {
    console.log("No manual available for this page:", currentPath);
  }
};

function onInfo() {
  router.push(`/retire`);
}

// landing page redirect
const landingPageUrl = ref<string>(configParam.landingPageUrl);

function onViewDetailNoti(url: string) {
  window.open(url, "_blank");
}
</script>

<!-- โครงเว็บ -->
<template>
  <q-layout view="hHh LpR fFr">
    <!-- header -->
    <q-header flat class="text-dark col-12 bg-top header-br" height-hint="7">
      <q-toolbar
        class="q-my-xs items-center"
        :style="$q.screen.gt.xs ? 'padding: 1% 2%;' : 'padding: 1% 4%;'"
      >
        <div class="row items-center no-wrap" v-if="$q.screen.gt.xs">
          <q-img
            src="@/assets/logo.png"
            spinner-color="white"
            style="height: 35px; max-width: 35px"
          />
          <div class="row q-ml-md items-center q-pt-xs">
            <div
              style="color: #ffffff; letter-spacing: 1px; line-height: 10px"
              class="text-body2 text-weight-bolder col-12"
            >
              ระบบ<span class="text-primary">บริหารทรัพยากรบุคคล</span>
            </div>
            <div class="text-caption text-white">ของกรุงเทพมหานคร</div>
          </div>
        </div>
        <div v-else class="row items-center">
          <img src="@/assets/logo.png" style="height: 35px; max-width: 35px" />
        </div>
        <div v-if="$q.screen.gt.xs">
          <q-tabs
            v-model="tab"
            align="justify"
            indicator-color="transparent"
            active-color="white bg-white-btn border-100"
            dense
            inline-label
            class="text-grey-5 tabsHome"
          >
            <q-tab
              class="border-100 q-mr-sm"
              name="dashboard"
              label="หน้าแรก"
              icon="mdi-view-dashboard-outline"
              @click="router.push(`/`)"
            />
            <!-- <q-tab class="border-100" name="Checkin" label="ลงเวลางาน" icon="mdi-map-marker-check-outline"
              @click="router.push(`/check-in`)" /> -->
            <q-tab
              class="border-100 q-mr-sm"
              name="leave"
              label="การลา"
              icon="mdi-calendar-blank-outline"
              @click="router.push(`/leave`)"
            />
          </q-tabs>
        </div>
        <q-space />
        <q-btn
          round
          dense
          flat
          size="13px"
          class="bg-white-btn"
          :color="totalNoti === 0 ? 'grey-6' : 'grey-8'"
          no-caps
          @click="handleButtonClick()"
          style="margin-right: 10px"
        >
          <q-icon name="mdi-book-open-variant" size="18px" color="white" />
          <q-tooltip>คู่มือ</q-tooltip>
        </q-btn>

        <!-- Notification -->
        <q-btn
          round
          dense
          flat
          size="13px"
          class="bg-white-btn"
          :color="totalNoti === 0 ? 'grey-6' : 'grey-8'"
          no-caps
          style="margin-right: 10px"
        >
          <q-icon name="mdi-bell-outline" size="22px" color="white" />
          <q-badge
            rounded
            v-show="totalNoti !== 0"
            color="negative"
            text-color="white"
            floating
            >{{ totalNoti }}</q-badge
          >
          <q-menu v-model="notiTrigger" :offset="[0, 8]" style="width: 480px">
            <div class="q-px-md q-py-sm row col-12 items-center">
              <div class="text-subtitle1 text-weight-medium">การแจ้งเตือน</div>
              <q-space />
              <div class="text-grey-5" style="font-size: 12px">
                ทั้งหมด {{ totalInbox }} ข้อความ
              </div>
            </div>
            <q-infinite-scroll
              @load="onLoad"
              :offset="250"
              v-if="statusLoad === false"
            >
              <div
                v-for="(item, index) in notiList"
                :key="index"
                :class="
                  item.payload
                    ? 'caption q-pa-xs cursor-pointer'
                    : 'caption q-pa-xs'
                "
                @click.stop.prevent="
                  item.payload ? onViewDetailNoti(item.payload) : ''
                "
              >
                <q-item
                  :class="
                    !item.isOpen
                      ? 'mytry q-py-xs my-menu-link'
                      : 'mytry q-py-xs'
                  "
                  :clickable="item.payload !== ''"
                  :v-ripple="item.payload !== ''"
                  dense
                >
                  <q-item-section avatar top style="min-width: 40px">
                    <q-avatar color="primary" size="22px" text-color="white">
                      <span class="text-weight-medium text-uppercase">{{
                        item.body[0]
                      }}</span>
                    </q-avatar>
                  </q-item-section>
                  <q-item-section>
                    <q-item-label caption class="text-black"
                      >{{ item.body }}
                      <q-btn
                        v-if="item.payload !== ''"
                        size="sm"
                        flat
                        round
                        dense
                        icon="mdi-link"
                        color="primary"
                      ></q-btn>
                    </q-item-label>
                    <q-item-label caption class="row items-center text-grey-7">
                      {{ date2Thai(item.receiveDate) }}
                      {{
                        new Date(item.receiveDate).toLocaleTimeString(
                          "th-TH",
                          thaiOptions
                        )
                      }}
                      น.</q-item-label
                    >
                  </q-item-section>
                  <!-- <q-item-section>
                    <q-item-label caption class="text-grey-7">
                      {{ date2Thai(item.receiveDate) }}
                      {{
                        new Date(item.receiveDate).toLocaleTimeString(
                          "th-TH",
                          thaiOptions
                        )
                      }}
                      น. <q-space />
                    </q-item-label>
                    <q-item-label
                      caption
                      :class="
                        item.isOpen
                          ? 'text-grey-7'
                          : 'text-dark text-weight-medium'
                      "
                      >{{ item.body }}</q-item-label
                    >
                    <q-item-label
                      caption
                      class="row items-center text-grey-7"
                      style="font-size: 12px"
                      >{{ item.timereceive }}</q-item-label
                    >
                  </q-item-section> -->
                  <div>
                    <q-btn
                      size="sm"
                      unelevated
                      dense
                      icon="mdi-close"
                      class="mybtn q-mx-xs"
                      @click="clickDelete(item.id, index)"
                    ></q-btn>
                  </div>
                </q-item>
              </div>

              <template
                v-slot:loading
                v-if="
                  notiList.length < totalInbox ||
                  (notiList.length === 0 && totalInbox === 0)
                "
              >
                <div class="text-center q-my-md">
                  <q-spinner-dots color="primary" size="40px" />
                </div>
              </template>
            </q-infinite-scroll>
            <div class="q-pa-md" v-else>
              <q-banner rounded class="bg-amber-1 text-center">
                <div class="text-yellow-10">
                  <q-icon
                    name="mdi-alert-box"
                    class="q-mx-xs"
                    size="sm"
                    color="yellow-10"
                  />
                  ไม่มีข้อมูล
                </div>
              </q-banner>
            </div>
          </q-menu>
        </q-btn>

        <!-- User -->
        <q-btn-dropdown
          v-if="$q.screen.gt.xs"
          rounded
          dense
          flat
          :class="$q.screen.gt.xs ? 'bg-white-btn' : ''"
          color="white"
          class="q-pr-sm border-10"
          dropdown-icon="mdi-chevron-down"
        >
          <template v-slot:label>
            <q-item dense v-close-popup class="q-pa-none q-pl-xs">
              <q-item-section avatar class="q-pa-none" style="min-width: 30px">
                <q-img
                  :src="dataStore.profileImg"
                  class="border-100"
                  spinner-color="white"
                  style="height: 30px; max-width: 30px"
                />
              </q-item-section>
              <q-item-section class="text-left text-white q-pa-none q-pl-sm">
                <q-item-label class="text-caption text-weight-medium">{{
                  fullname
                }}</q-item-label>
              </q-item-section>
            </q-item>
          </template>
          <q-list>
            <q-item
              clickable
              v-close-popup
              @click="redirectToLandingPage"
              v-if="isSsoToken"
            >
              <q-item-section avatar style="min-width: 30px">
                <q-avatar
                  color="blue"
                  text-color="white"
                  icon="home"
                  size="18px"
                  font-size="14px"
                />
              </q-item-section>
              <q-item-section> Landing Page </q-item-section>
            </q-item>

            <q-item clickable v-close-popup @click="onInfo">
              <q-item-section avatar style="min-width: 30px">
                <q-icon
                  color="red-9"
                  size="18px"
                  name="mdi-account-remove-outline"
                />
              </q-item-section>
              <q-item-section
                ><q-item-label>ขอลาออก</q-item-label></q-item-section
              >
            </q-item>

            <!-- <q-item clickable v-close-popup>
              <q-item-section avatar style="min-width: 30px">
                <q-icon color="orange-9" size="18px" name="mdi-lock-outline" />
              </q-item-section>
              <q-item-section
                ><q-item-label>เปลี่ยนรหัสผ่าน</q-item-label></q-item-section
              >
            </q-item> -->

            <q-item clickable v-close-popup @click="doLogout">
              <q-item-section avatar style="min-width: 30px">
                <q-icon color="primary" size="18px" name="mdi-logout-variant" />
              </q-item-section>
              <q-item-section>
                <q-item-label>ออกจากระบบ</q-item-label>
              </q-item-section>
            </q-item>
          </q-list>
        </q-btn-dropdown>

        <div v-else class="q-ml-sm" style="width: 30px">
          <q-btn round>
            <q-avatar>
              <q-img
                :src="dataStore.profileImg"
                class="border-100"
                spinner-color="white"
              />
            </q-avatar>
            <q-menu>
              <q-list dense>
                <q-item clickable v-close-popup :href="landingPageUrl">
                  <q-item-section avatar style="min-width: 30px">
                    <q-avatar
                      color="blue"
                      text-color="white"
                      icon="home"
                      size="18px"
                    />
                  </q-item-section>
                  <q-item-section> Landing Page </q-item-section>
                </q-item>
                <q-item clickable v-close-popup @click="onInfo">
                  <q-item-section avatar style="min-width: 30px">
                    <q-icon
                      color="red-9"
                      size="18px"
                      name="mdi-account-remove-outline"
                    />
                  </q-item-section>
                  <q-item-section
                    ><q-item-label>ขอลาออก</q-item-label></q-item-section
                  >
                </q-item>

                <!-- <q-item clickable v-close-popup>
                  <q-item-section avatar style="min-width: 30px">
                    <q-icon
                      color="orange-9"
                      size="18px"
                      name="mdi-lock-outline"
                    />
                  </q-item-section>
                  <q-item-section
                    ><q-item-label
                      >เปลี่ยนรหัสผ่าน</q-item-label
                    ></q-item-section
                  >
                </q-item> -->

                <q-item clickable v-close-popup @click="doLogout">
                  <q-item-section avatar style="min-width: 30px">
                    <q-icon
                      color="primary"
                      size="18px"
                      name="mdi-logout-variant"
                    />
                  </q-item-section>
                  <q-item-section>
                    <q-item-label>ออกจากระบบ</q-item-label>
                  </q-item-section>
                </q-item>
              </q-list>
              <!-- <q-list dense style="min-width: 200px">
                <q-item clickable v-close-popup>
                  <q-item-section>
                    <div class="row items-center">
                      <q-list>
                        <q-item clickable v-close-popup @click="onInfo">
                          <q-item-section avatar style="min-width: 30px">
                            <q-icon
                              color="blue-9"
                              size="18px"
                              name="mdi-clipboard-account-outline"
                            />
                          </q-item-section>
                          <q-item-section
                            ><q-item-label
                              >ข้อมูลทะเบียนประวัติ</q-item-label
                            ></q-item-section
                          >
                        </q-item>
                        <q-item clickable v-close-popup>
                          <q-item-section avatar style="min-width: 30px">
                            <q-icon
                              color="orange-9"
                              size="18px"
                              name="mdi-lock-outline"
                            />
                          </q-item-section>
                          <q-item-section
                            ><q-item-label
                              >เปลี่ยนรหัสผ่าน</q-item-label
                            ></q-item-section
                          >
                        </q-item>

                        <q-item clickable v-close-popup @click="doLogout">
                          <q-item-section avatar style="min-width: 30px">
                            <q-icon
                              color="primary"
                              size="18px"
                              name="mdi-logout-variant"
                            />
                          </q-item-section>
                          <q-item-section>
                            <q-item-label>ออกจากระบบ</q-item-label>
                          </q-item-section>
                        </q-item>
                      </q-list>
                    </div>
                  </q-item-section>
                </q-item>
              </q-list> -->
            </q-menu>
          </q-btn>
        </div>
      </q-toolbar>
    </q-header>
    <div
      class="bg-top"
      :style="$q.screen.gt.xs ? 'height: 200px;' : 'height: 200px;'"
    />
    <!-- end header -->

    <q-footer class="bg-top" v-if="!$q.screen.gt.xs">
      <q-toolbar style="padding: 2% 2%">
        <div class="row col-12 justify-around">
          <q-btn
            flat
            round
            color="white"
            icon="mdi-home"
            @click="router.push(`/`)"
          />
          <!-- <q-btn
            flat
            round
            color="white"
            icon="mdi-map-marker-check-outline"
            @click="router.push(`/check-in`)"
          /> -->
          <q-btn
            flat
            round
            color="white"
            icon="mdi-calendar-blank-outline"
            @click="router.push(`/leave`)"
          />
          <q-btn
            flat
            round
            color="white"
            icon="mdi-account-outline"
            @click="router.push(`/registry`)"
          />
        </div>
      </q-toolbar>
    </q-footer>

    <q-page-container class="bg-grey-2 q-pb-md">
      <q-page
        :style="
          $q.screen.gt.xs
            ? 'padding: 1.8% 2%; margin-top: -200px;'
            : 'padding: 5% 4%; margin-top: -200px;'
        "
      >
        <router-view :key="$route.fullPath" />
      </q-page>
    </q-page-container>
  </q-layout>
</template>

<style>
.bg-drawer {
  background: #242a3d;
}

.menu {
  padding-bottom: 5px;
  padding-top: 5px;
}

.tabsHome .q-tab__icon {
  font-size: 18px;
}

.border-100 {
  border-radius: 100px;
}

.bg-top {
  background: #273238;
}

.header-br {
  border-bottom: 1px solid #fdfdfd31;
}

.menuActive {
  background: #1e2234;
  border-radius: 0 100px 100px 0;
  margin-right: 4%;
}

.q-card {
  box-shadow: 3px 3px 20px -10px rgba(151, 150, 150, 0.261) !important;
  /* border: 1px solid #eeeded; */
  border-radius: 8px;
}

.q-menu {
  box-shadow: 3px 3px 10px 1px rgba(95, 95, 95, 0.15) !important;
}

.toptitle {
  font-size: 1.2rem;
  font-weight: bold;
  margin-bottom: 1.2%;
}

.q-field--outlined .q-field__control {
  border-radius: 5px;
}

.q-field--outlined .q-field__control:before {
  border-color: #c8d3db;
}

/* .q-field--outlined .q-icon {
  color: #7474747f;
} */

.shadow-0 {
  box-shadow: none !important;
}

.btnBlue {
  background-color: #016987;
  color: #fff;
}
</style>
