<script setup lang="ts">
import { ref, watch } from "vue";
import { useQuasar } from "quasar";

import http from "@/plugins/http";
import config from "@/app.config";
import { useCounterMixin } from "@/stores/mixin";

import type { QTableProps } from "quasar";
import type { Roles } from "@/modules/02_users/interface/request/Main";

/** importComponents*/
import DialogHeader from "@/components/DialogHeader.vue";

/** use*/
const $q = useQuasar();
const {
  showLoader,
  hideLoader,
  dialogConfirm,
  messageError,
  success,
  dialogMessageNotify,
} = useCounterMixin();

/**  props*/
const modal = defineModel<boolean>("modal", { required: true });
const roleSuper = defineModel<boolean>("roleSuper", { required: true });
const userId = defineModel<string>("userId", { required: true });
const isUpdate = defineModel<boolean>("isUpdate", { required: true });
const roles = defineModel<any[]>("roles");
const props = defineProps({
  fetchlist: {
    type: Function,
    required: true,
  },
});

// Table
const rows = ref<Roles[]>([]); // รายการสิทธิ์
const columns = ref<QTableProps["columns"]>([
  {
    name: "name",
    align: "left",
    label: "ชื่อ",
    sortable: true,
    field: "name",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
  },
  {
    name: "description",
    align: "left",
    label: "คำอธิบาย",
    sortable: true,
    field: "description",
    headerStyle: "font-size: 14px",
    style: "font-size: 14px",
  },
]);
const visibleColumns = ref<string[]>(["name", "description"]);

const selected = ref<Roles[]>([]); // รายการสิทธิ์ที่เลือก

/**
 * ฟังก์ชันดึงข้อมูลรายการสิทธิ์ทั้งหมด
 */
function fetchlistRole() {
  showLoader();
  http
    .get(config.API.managementRole)
    .then((res) => {
      const rolesIds = roles.value?.map((e) => e.id);
      const item = roleSuper.value
        ? ["USER", "ADMIN", "SUPER_ADMIN", "STAFF"]
        : ["USER", "STAFF"];

      rows.value = res.data.filter(
        (v: Roles) => !rolesIds?.includes(v.id) && item.includes(v.name)
      );
    })
    .catch((err) => {
      messageError($q, err);
    })
    .finally(() => {
      hideLoader();
    });
}

/**
 * ฟังก์ชันยืนยันการบันทึกการเพิ่มสิทธิ์
 *
 * เมื่อเสร็จจะโหลดข้อมูลรายการสิทธิ์ที่มีใหม่
 */
function onSubmit() {
  // เช็ครายการสิทธิ์ที่เลือก
  if (selected.value.length === 0) {
    // ไม่มีแสดงข้อคาวมเตือน
    dialogMessageNotify($q, "กรุณาเลือก role อย่างน้อง 1 role");
  } else {
    // ยืนยันการบันทึกการเพิ่มสิทธิ์
    dialogConfirm($q, async () => {
      showLoader();
      const body = { role: selected.value.map((e: { id: string }) => e.id) };
      http
        .post(config.API.management + `/${userId.value}/role`, body)
        .then(async () => {
          await props.fetchlist?.();
          success($q, "บันทึกข้อมูลสำเร็จ");
          closeDialog();
          isUpdate.value = true;
        })
        .catch((err) => {
          messageError($q, err);
        })
        .finally(() => {
          hideLoader();
        });
    });
  }
}

/**
 * ฟังก์ชัน ปิด Dialog  และกำหนดให้รายการสิทธิ์ที่เลือกเป็นค่าว่าง
 */
function closeDialog() {
  modal.value = false;
  selected.value = [];
}

/**
 * ดู modal เมื่อ modal เป็น true ทำการโหลข้อมูลรายการสิทธิ์ทั้งหมด
 */
watch(
  () => modal.value,
  () => {
    if (modal.value) {
      fetchlistRole();
    }
  }
);
</script>

<template>
  <q-dialog v-model="modal" persistent>
    <q-card class="col-12" style="width: 35%">
      <DialogHeader tittle="เพิ่มสิทธิ์" :close="closeDialog" />
      <q-separator />
      <q-card-section>
        <div class="col-12 q-pt-sm">
          <d-table
            ref="table"
            :columns="columns"
            :rows="rows"
            row-key="id"
            flat
            bordered
            :paging="true"
            dense
            :rows-per-page-options="[10, 25, 50, 100]"
            :visible-columns="visibleColumns"
            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 v-for="col in props.cols" :key="col.name" :props="props">
                  <div>
                    {{ col.value ? col.value : "-" }}
                  </div>
                </q-td>
              </q-tr>
            </template>
          </d-table>
        </div>
      </q-card-section>
      <q-separator />
      <q-card-actions align="right">
        <q-btn label="บันทึก" color="secondary" @click="onSubmit"
          ><q-tooltip>บันทึกข้อมูล</q-tooltip></q-btn
        >
      </q-card-actions>
    </q-card>
  </q-dialog>
</template>

<style scoped></style>
