import { defineStore } from 'pinia'
import { ref } from 'vue'
import type { FormData, Datalist } from '@/interface/response/checkin'
import { useCounterMixin } from '@/stores/mixin'
import { calculateFiscalYear } from '@/utils/function'

const mixin = useCounterMixin()
const { date2Thai } = mixin

/** store for checkin history*/
export const useChekIn = defineStore('checkin', () => {
  const year = ref<number>(calculateFiscalYear(new Date())) //ปีงบประมาณ
  const rows = ref<Datalist[]>([])
  const tab = ref<string>('history')

  /**
   * ฟังก์ชั่นสำหรับ map ข้อมูล เพื่อแสดงรายการในตารางประวัติการลงเวลา
   * @param data รายการข้อมูลทีต้องการ map เป็น array ที่ประกอบด้วย object ตาม FormData
   */
  async function fetchHistoryList(data: FormData[]) {
    rows.value = []
    const dataList: Datalist[] = data.map((e: FormData) => ({
      checkInId: e.checkInId,
      checkInDate: e.checkInDate ? date2Thai(e.checkInDate) : null,
      checkInDateTime: e.checkInDate ? e.checkInDate : e.checkOutDate,
      checkInTime: e.checkInTime,
      checkOutTime: e.checkOutTime != '' ? e.checkOutTime : '-',
      checkInStatus: e.checkInStatus ? convertStatus(e.checkInStatus) : '-',
      checkOutStatus:
        e.checkOutStatus != null ? convertStatus(e.checkOutStatus) : '-',
      checkInLocation: e.checkInLocation ? e.checkInLocation : '-',
      checkOutLocation: e.checkOutLocation != '' ? e.checkOutLocation : '-',
      editStatus: e.editStatus != '' ? convertEditStatus(e.editStatus) : '',
      editReason: e.editReason,
      isEdit: e.isEdit,
    }))
    rows.value = dataList
  }

  /**
   * ฟังก์ชั่นสำหรับ convert ข้อความสถานะของการลงเวลา ปกติ, ขาดราชการ หรือสาย
   * @param status ฟิลด์สถานะที่มาจาก API
   * @returns ข้อความสถานะ ปกติ, ขาดราชการ หรือสาย
   */
  function convertStatus(status: string) {
    switch (status) {
      case 'ABSENT':
        return 'ขาดราชการ'
      case 'NORMAL':
        return 'ปกติ'
      case 'LATE':
        return 'สาย'
      case 'NOT_COMPLETE':
        return 'ปฏิบัติงานไม่ครบตามกำหนดเวลา'
      default:
        return '-'
    }
  }

  /**
   * ฟังก์ชั่นสำหรับ convert ข้อความสถานะการขอแก้ไข/การขอลงเวลาพิเศษ
   * @param val ฟิลด์สถานะการขอแก้ไข/การขอลงเวลาพิเศษที่มาจาก API
   * @returns ข้อความสถานะการขอแก้ไข/การขอลงเวลาพิเศษ
   */
  function convertEditStatus(val: string) {
    switch (val) {
      case 'PENDING':
        return 'รออนุมัติ'
      case 'APPROVE':
        return 'อนุมัติ'
      case 'REJECT':
        return 'ไม่อนุมัติ'
      default:
        return ''
    }
  }

  /**
   * ฟังก์ชั่นสำหรับแสดง class กรณีสถานะการขอลงเวลาพิเศษ
   * @param val ข้อความสถานะการขอลงเวลาพิเศษที่ convert แล้ว
   * @returns ค่าสีที่ต้องการแสดงตามข้อความสถานะ
   */
  function classColorStatus(val: string) {
    switch (val) {
      case 'รออนุมัติ':
        return 'orange'
      case 'อนุมัติ':
        return 'green'
      case 'ไม่อนุมัติ':
        return 'red'
      default:
        return ''
    }
  }

  return {
    rows,
    year,
    fetchHistoryList,
    classColorStatus,
    tab,
  }
})
