<script setup lang="ts">
import { ref, onMounted, watch } from "vue";
import { useQuasar } from "quasar";
import { useRouter, useRoute } from "vue-router";

import http from "@/plugins/http";
import config from "@/app.config";
import { useCounterMixin } from "@/stores/mixin";
import { useDevelopmentDataStore } from "@/modules/15_development/store/developmentStore";

/** importComponents*/
import BasicInfo from "@/modules/15_development/components/BasicInfo.vue"; // ข้อมูลเบื้องต้น
import Target from "@/modules/15_development/components/Target.vue"; // เป้าหมาย
import ProjectDetail from "@/modules/15_development/components/ProjectDetail.vue"; // ลักษณะโครงการ
import Budget from "@/modules/15_development/components/Budget.vue"; // งบประมาณ
import Risk from "@/modules/15_development/components/Risk.vue"; //ความเสี่ยง
import FollowResult from "@/modules/15_development/components/FollowResult.vue"; // การติดตามประเมินผล
import Other from "@/modules/15_development/components/Other.vue"; // อื่นๆ

/** use*/
const $q = useQuasar();
const router = useRouter();
const route = useRoute();
const store = useDevelopmentDataStore();
const { success, showLoader, hideLoader, messageError, dialogConfirm } =
  useCounterMixin();

const checkRoutePermission = ref<boolean>(
  route.name == "developmentDetailPage"
);
const title = ref<string>(route.params.id ? "แก้ไข" : "เพิ่ม");
const projectId = ref<string>(route.params.id.toLocaleString()); //id route
const tab = ref<string>("BasicInfo"); //tab เริ่มต้น
const status = ref<string>("ONGOING"); //สถานะเริ่มต้น
const step = ref<string[]>([
  "BasicInfo",
  "Target",
  "ProjectDetail",
  "Budget",
  "Risk",
  "FollowResult",
  "Other",
  "Result",
]);

const isChangeData = ref<boolean>(false);

const childBasicInfoRef = ref<InstanceType<typeof BasicInfo> | null>(null);
const childProjectDetailRef = ref<InstanceType<typeof ProjectDetail> | null>(
  null
);
const childBudgetRef = ref<InstanceType<typeof Budget> | null>(null);
const childRiskRef = ref<InstanceType<typeof Risk> | null>(null);
const childFollowResultRef = ref<InstanceType<typeof FollowResult> | null>(
  null
);
const childOtherRef = ref<InstanceType<typeof Other> | null>(null);

//ย้อนกลับ
function prevStep() {
  const index = step.value.indexOf(tab.value);
  if (index > 0) {
    tab.value = step.value[index - 1];
  }
}

// ไปข้างหน้า
function nextStep() {
  const index = step.value.indexOf(tab.value);
  if (index < step.value.length - 1) {
    tab.value = step.value[index + 1];
  }
}
/**
 * function fetch สถานะ Project
 * @param id projectId
 */
function getStatus(id: string) {
  showLoader();
  http
    .get(config.API.developmentMainStatus(id))
    .then((res) => {
      status.value = res.data.result.status;
      store.projectStatus = res.data.result.status;
    })
    .catch((e) => {
      messageError($q, e);
      hideLoader();
    });
  // .finally(() => {});
}

/** function ยืนยันการเสร็จสิ้นโครงการ*/
function onFinish(id: string) {
  dialogConfirm(
    $q,
    async () => {
      showLoader();
      http
        .get(config.API.developmentMainFinish(id))
        .then(() => {
          getStatus(id);
          success($q, "บันทึกข้อมูลสำเร็จ");
        })
        .catch((e) => {
          messageError($q, e);
        })
        .finally(() => {
          hideLoader();
        });
    },
    "ยืนยันการเสร็จสิ้นโครงการ",
    "ต้องการยืนยันการเสร็จสิ้นโครงการนี้ใช่หรือไม่?"
  );
}

/**
 * function เช็คการแกไข้ข้อมูล
 */
function onCheckChangeData() {
  isChangeData.value = true;
}

watch(tab, (newValue, oldValue) => {
  console.log(`Count changed from ${oldValue} to ${newValue}`);
  if (isChangeData.value) {
    // เรียกใช้ฟังก์ชันของ component ลูก
    if (oldValue === "BasicInfo") {
      childBasicInfoRef.value?.onSubmit();
    } else if (oldValue === "ProjectDetail") {
      childProjectDetailRef.value?.onSubmit();
    } else if (oldValue === "Budget") {
      childBudgetRef.value?.onSubmit();
    } else if (oldValue === "Risk") {
      childRiskRef.value?.onSubmit();
    } else if (oldValue === "FollowResult") {
      childFollowResultRef.value?.onSubmit();
    } else if (oldValue === "Other") {
      childOtherRef.value?.onSubmit();
    }
  }
});

/** hooklifecycle*/
onMounted(() => {
  projectId.value && getStatus(projectId.value);
});
</script>
<template>
  <div class="toptitle text-dark col-12 row items-center">
    <q-btn
      flat
      round
      dense
      class="q-mr-sm"
      icon="mdi-arrow-left"
      color="primary"
      @click="router.go(-1)"
    />
    {{
      checkRoutePermission
        ? "รายละเอียดโครงการ/หลักสูตรการฝึกอบรม"
        : `${title}โครงการ/หลักสูตรการฝึกอบรม`
    }}
    <q-space />
    <div v-if="!checkRoutePermission"></div>
    <q-btn
      v-if="status === 'ONGOING' && !checkRoutePermission"
      unelevated
      label="เสร็จสิ้นโครงการ"
      color="green"
      @click="onFinish(projectId)"
    >
      <q-tooltip>เสร็จสิ้นโครงการ</q-tooltip>
    </q-btn>
    <q-badge
      v-else-if="status !== 'ONGOING' || !checkRoutePermission"
      outline
      color="primary"
      class="q-px-sm q-py-xs"
      >เสร็จสิ้นโครงการ</q-badge
    >
  </div>

  <q-card flat bordered class="col-12">
    <q-tabs
      v-model="tab"
      dense
      align="left"
      inline-label
      class="rounded-borders"
      indicator-color="primary"
      active-bg-color="teal-1"
      active-class="text-primary"
    >
      <q-tab name="BasicInfo" label="ข้อมูลเบื้องต้น" />
      <q-tab name="Target" label="เป้าหมาย" />
      <q-tab name="ProjectDetail" label="ลักษณะโครงการ" />
      <q-tab name="Budget" label="งบประมาณ" />
      <q-tab name="Risk" label="ความเสี่ยงและประโยชน์ที่จะได้รับ" />
      <q-tab name="FollowResult" label="การติดตามประเมินผล" />
      <q-tab name="Other" label="อื่นๆ" />
      <!-- v-if="status !== 'ONGOING'" -->
      <!-- <q-tab name="Record" label="บันทึกผล" /> -->
    </q-tabs>
    <q-separator />
    <div class="q-pa-sm" style="padding: 0px">
      <q-tab-panels v-model="tab" animated>
        <!-- ข้อมูลเบื้องต้น -->
        <q-tab-panel style="padding: 0px" name="BasicInfo">
          <BasicInfo
            ref="childBasicInfoRef"
            :next-step="nextStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>

        <!-- เป้าหมาย -->
        <q-tab-panel name="Target">
          <Target :prev-step="prevStep" :next-step="nextStep" />
        </q-tab-panel>

        <!-- ลักษณะโครงการ -->
        <q-tab-panel name="ProjectDetail" style="padding: 0px">
          <ProjectDetail
            ref="childProjectDetailRef"
            :prev-step="prevStep"
            :next-step="nextStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>

        <!-- งบประมาณ -->
        <q-tab-panel name="Budget" style="padding: 0px">
          <Budget
            ref="childBudgetRef"
            :status="status"
            :prev-step="prevStep"
            :next-step="nextStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>

        <!-- ความเสี่ยงและประโยชน์ที่จะได้รับ -->
        <q-tab-panel name="Risk" style="padding: 0px">
          <Risk
            ref="childRiskRef"
            :prev-step="prevStep"
            :next-step="nextStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>
        <q-tab-panel name="FollowResult" style="padding: 0px">
          <FollowResult
            ref="childFollowResultRef"
            :status="status"
            :prev-step="prevStep"
            :next-step="nextStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>
        <q-tab-panel name="Other" style="padding: 0px">
          <Other
            ref="childOtherRef"
            :status="status"
            :prev-step="prevStep"
            :on-check-change-data="onCheckChangeData"
            v-model:is-change-data.value="isChangeData"
          />
        </q-tab-panel>
      </q-tab-panels>
    </div>
  </q-card>
</template>

<style scoped></style>
