<template>
  <NuxtLayout name="default" :menu="adminMenu">
    <div class="pages role-section-page p-3">
      <SubHeaderWithSelect
        :enableNewButton="false"
        :showProjectSelect="$attrs.showProjectSelect"
        @open-form="toggleRolesPanel()"
        title="دسترسی های کاربران"
      >
      </SubHeaderWithSelect>

      <div class="pages-content">
        <template v-if="canView">
          <div class="container">
            <div class="row">
              <div class="col-12 col-md-8 mx-auto">
                <ul class="nav nav-tabs mb-3">
                  <li
                    v-for="({ id, title }, index) in roles"
                    :key="index"
                    :value="id"
                    class="nav-item"
                  >
                    <a
                      class="nav-link text-center"
                      :class="{ active: activeTabIndex == index }"
                      :href="title"
                      @click.prevent="onTabClick(id, index)"
                    >
                      {{ title }}
                    </a>
                  </li>
                </ul>

                <Accordion
                  class="role-permission"
                  canEdit="role-permission_edit"
                  :role_id="role_id"
                ></Accordion>
              </div>
            </div>
          </div>
        </template>
        <no-data v-else>
          <the-content-loading v-if="fetchingData"></the-content-loading>

          <div v-else class="d-flex justify-content-center align-items-center">
            <div
              class="alert alert-warning d-flex justify-content-center align-items-center"
            >
              <span
                class="tavasi tavasi-warning-circle color-inherit ms-1 text__32"
              ></span>
              عدم دسترسی
            </div>
          </div>
        </no-data>
      </div>
    </div>
  </NuxtLayout>
</template>

<script>
// import apis from "@apis/permitApi";
import apis from "~/apis/permitApi";
import adminMenu from "~/json/admin/json/menu.json";
import { defineAsyncComponent } from "vue";
import { mapActions, mapState } from "pinia";
import { useCommonStore } from "~/stores/commonStore";
import { usePermitStore } from "~/stores/permitStore";
// import { DEFAULT_CONFIG } from "vue-codemirror";
// import { mapGetters, mapMutations, mapActions } from "vuex";

export default {
  name: "rolePermission",
  setup() {
    definePageMeta({
      name: "rolePermission",
      layout: false,
    });
  },
  mounted() {
    this.checkPermisionBeforGetList();
  },
  watch: {
    projectGetter() {
      this.checkPermisionBeforGetList();
    },
  },
  components: {
    Accordion: defineAsyncComponent(() =>
      import("@/components/admin/components/Accordion.vue")
    ),
  },
  created() {
    this.httpService = useNuxtApp()["$http"];
  },
  data() {
    return {
      adminMenu: adminMenu,
      roles: [],
      httpService: {},
      collapseAll: false,
      role_id: undefined,
      roleSection: [],
      canView: false,
      fetchingData: false,
      activeTabIndex: 0,
    };
  },
  computed: {
    // ...mapGetters("permit", ["projectsGetter", "projectGetter"]),
    ...mapState(usePermitStore, ["projectGetter", "projectsGetter"]),
    projects() {
      return this.projectsGetter ?? [];
    },
    project_id: {
      get() {
        return this.projectGetter?.id;
      },
      set(newVal) {
        this.setProject(newVal);
      },
    },
  },
  methods: {
    // ...mapActions(["checkPermissions"]),

    // ...mapMutations("permit", ["SET_PROJECT"]),
    // ...mapActions("permit", ["getProjects"]),

    ...mapActions(useCommonStore, ["checkPermissions"]),
    ...mapActions(usePermitStore, ["SET_PROJECT"]),
    ...mapActions(usePermitStore, ["getProjects"]),

    onTabClick(id, index) {
      this.activeTabIndex = index;
      this.role_id = id;
    },
    async getRoles() {
      return await this.httpService
        .postRequest(permitUrl() + apis.roles.list, {
          project_id: this.projectGetter?.id,
        })
        .then((response) => {
          
          this.roles = response?.data;

          this.role_id =
            this.roles && this.roles[0] ? this.roles[0].id : undefined;
        });
    },
    checkPermisionBeforGetList() {
      if (this.fetchingData) return;
      this.fetchingData = true;

      this.checkPermissions({ permission: "role-permission_view", _this: this })
        .then(() => {
          if (this.projectGetter) {
            this.getRoles()
              .then(() => {
                this.canView = true;
                this.fetchingData = false;
              })
              .catch(() => {
                this.canView = false;
                this.fetchingData = false;
              });
          } else {
            this.getProjects().then(() => {
              this.getRoles()
                .then(() => {
                  this.canView = true;
                  this.fetchingData = false;
                })
                .catch(() => {
                  this.canView = false;
                  this.fetchingData = false;
                });
            });
          }
        })
        .catch(() => {
          this.canView = false;
          this.fetchingData = false;
        });
    },
    async getProjects() {
      return await this.httpService
        .postRequest(permitUrl() + apis.projects.list)
        .then((res) => {
          this.SET_PROJECT(res.data[0]);
        });
    },
    setProject(id) {
      // const id = +$ev.target.value;
      const result = this.projects.findIndex((item) => item.id === id);
      const project = this.projects[result];

      this.SET_PROJECT(project);
    },
  },
};
</script>
