import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
import moment from 'moment'
import type { DataDateMonthObject } from '@/modules/01_exam/interface/index/Main'
import CustomComponent from '@/components/CustomDialog.vue'

export const useCounterMixin = defineStore('mixin', () => {
  /**
   * ฟังก์ชันกลาง
   */

  const calAge = (srcDate: Date, birthCal: Date = new Date(), eng: boolean = false) => {
    const toDay = birthCal
    const birth = new Date(srcDate)

    const yearNow = toDay.getFullYear()
    const monthNow = toDay.getMonth()
    const dateNow = toDay.getDate()

    const yearDob = birth.getFullYear()
    const monthDob = birth.getMonth()
    const dateDob = birth.getDate()

    const lastYear = 12
    const subtractDate: Object = moment().subtract(1, 'months').endOf('month')

    const lastMonths = new Date(subtractDate.toString()).getDate()

    let yearAge = yearNow - yearDob
    let monthAge = 0
    let dateAge = 0

    if (monthNow >= monthDob) {
      monthAge = monthNow - monthDob
    } else {
      yearAge--
      monthAge = lastYear + monthNow - monthDob
    }

    if (dateNow >= dateDob) {
      dateAge = dateNow - dateDob
    } else {
      monthAge--
      dateAge = lastMonths + dateNow - dateDob

      if (monthAge < 0) {
        monthAge = 11
        yearAge--
      }
    }

    const age = {
      years: yearAge,
      months: monthAge,
      days: dateAge
    }

    const year = eng ? 'years' : 'ปี'
    const month = eng ? 'months' : 'เดือน'
    const day = eng ? 'days' : 'วัน'
    return `${yearAge} ${year} ${monthAge} ${month} ${dateAge} ${day}`
  }

  const calAgeYear = (srcDate: Date, birthCal: Date = new Date()) => {
    const toDay = birthCal
    const birth = new Date(srcDate)

    const yearNow = toDay.getFullYear()
    const monthNow = toDay.getMonth()
    const dateNow = toDay.getDate()

    const yearDob = birth.getFullYear()
    const monthDob = birth.getMonth()
    const dateDob = birth.getDate()

    const lastYear = 12
    const subtractDate: Object = moment().subtract(1, 'months').endOf('month')

    const lastMonths = new Date(subtractDate.toString()).getDate()

    let yearAge = yearNow - yearDob
    let monthAge = 0
    let dateAge = 0

    if (monthNow >= monthDob) {
      monthAge = monthNow - monthDob
    } else {
      yearAge--
      monthAge = lastYear + monthNow - monthDob
    }

    if (dateNow >= dateDob) {
      dateAge = dateNow - dateDob
    } else {
      monthAge--
      dateAge = lastMonths + dateNow - dateDob

      if (monthAge < 0) {
        monthAge = 11
        yearAge--
      }
    }
    return yearAge
  }

  function date2Thai(srcDate: Date, isFullMonth: boolean = false, isTime: boolean = false) {
    const date = new Date(srcDate)
    const isValidDate = Boolean(+date)
    if (!isValidDate) return srcDate.toString()
    if (isValidDate && date.getFullYear() < 1000) return srcDate.toString()
    const fullMonthThai = [
      'มกราคม',
      'กุมภาพันธ์',
      'มีนาคม',
      'เมษายน',
      'พฤษภาคม',
      'มิถุนายน',
      'กรกฎาคม',
      'สิงหาคม',
      'กันยายน',
      'ตุลาคม',
      'พฤศจิกายน',
      'ธันวาคม'
    ]
    const abbrMonthThai = [
      'ม.ค.',
      'ก.พ.',
      'มี.ค.',
      'เม.ย.',
      'พ.ค.',
      'มิ.ย.',
      'ก.ค.',
      'ส.ค.',
      'ก.ย.',
      'ต.ค.',
      'พ.ย.',
      'ธ.ค.'
    ]
    let dstYear = 0
    if (date.getFullYear() > 2500) {
      dstYear = date.getFullYear()
    } else {
      dstYear = date.getFullYear() + 543
    }
    let dstMonth = ''
    if (isFullMonth) {
      dstMonth = fullMonthThai[date.getMonth()]
    } else {
      dstMonth = abbrMonthThai[date.getMonth()]
    }
    let dstTime = ''
    if (isTime) {
      const H = date.getHours().toString().padStart(2, '0')
      const M = date.getMinutes().toString().padStart(2, '0')
      // const S = date.getSeconds().toString().padStart(2, "0")
      // dstTime = " " + H + ":" + M + ":" + S + " น."
      dstTime = ' ' + H + ':' + M + ' น.'
    }
    return date.getDate().toString().padStart(2, '0') + ' ' + dstMonth + ' ' + dstYear + dstTime
  }

  function monthYear2Thai(month: number, year: number, isFullMonth = false) {
    const date = new Date(`${year}-${month + 1}-1`)
    const fullMonthThai = [
      'มกราคม',
      'กุมภาพันธ์',
      'มีนาคม',
      'เมษายน',
      'พฤษภาคม',
      'มิถุนายน',
      'กรกฎาคม',
      'สิงหาคม',
      'กันยายน',
      'ตุลาคม',
      'พฤศจิกายน',
      'ธันวาคม'
    ]
    const abbrMonthThai = [
      'ม.ค.',
      'ก.พ.',
      'มี.ค.',
      'เม.ย.',
      'พ.ค.',
      'มิ.ย.',
      'ก.ค.',
      'ส.ค.',
      'ก.ย.',
      'ต.ค.',
      'พ.ย.',
      'ธ.ค.'
    ]
    let dstYear = 0
    if (date.getFullYear() > 2500) {
      dstYear = date.getFullYear()
    } else {
      dstYear = date.getFullYear() + 543
    }
    let dstMonth = ''
    if (isFullMonth) {
      dstMonth = fullMonthThai[date.getMonth()]
    } else {
      dstMonth = abbrMonthThai[date.getMonth()]
    }
    return dstMonth + ' ' + dstYear
  }

  function dateToISO(date: Date) {
    return (
      date.getFullYear() +
      '-' +
      appendLeadingZeroes(date.getMonth() + 1) +
      '-' +
      appendLeadingZeroes(date.getDate())
    )
  }

  function appendLeadingZeroes(n: Number) {
    if (n <= 9) return '0' + n
    return n
  }

  function textToPhone(n: string) {
    const p = n.substr(0, 3) + '-' + n.substr(3, 3) + '-' + n.substr(6, 4)
    return p
  }

  function textToFax(n: string) {
    const p = n.substr(0, 2) + '-' + n.substr(2, 3) + '-' + n.substr(5, 4)
    return p
  }

  const success = (q: any, val: string) => {
    // useQuasar ไม่สามารถใช้นอกไฟล์ .vue
    if (val !== '') {
      return q.notify({
        message: val,
        color: 'primary',
        icon: 'mdi-information',
        position: 'bottom-right',
        multiLine: true,
        timeout: 1000,
        badgeColor: 'positive',
        classes: 'my-notif-class'
      })
    }
  }

  function notify(q: any, val: string) {
    if (val !== '') {
      q.notify({
        color: 'teal-10',
        message: val,
        icon: 'mdi-information',
        position: 'bottom-right',
        multiLine: true,
        timeout: 7000,
        actions: [{ label: 'ปิด', color: 'white', handler: () => {} }]
      })
    }
  }

  function notifyError(q: any, val: string) {
    if (val !== '') {
      q.notify({
        message: val,
        color: 'red-5',
        icon: 'mdi-alert-circle',
        position: 'bottom-right',
        multiLine: true,
        timeout: 3000,
        badgeColor: 'warning',
        classes: 'my-notif-class'
      })
    }
  }

  const messageError = (q: any, e: any = '') => {
    if (e.response !== undefined) {
      if (e.response.data.status !== undefined) {
        q.dialog({
          component: CustomComponent,
          componentProps: {
            title: `พบข้อผิดพลาด`,
            message: `${e.response.data.message}`,
            icon: 'warning',
            color: 'red',
            onlycancel: true
          }
        })
      } else {
        q.dialog({
          component: CustomComponent,
          componentProps: {
            title: `พบข้อผิดพลาด`,
            message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`,
            icon: 'warning',
            color: 'red',
            onlycancel: true
          }
        })
      }
    } else {
      q.dialog({
        component: CustomComponent,
        componentProps: {
          title: `พบข้อผิดพลาด`,
          message: `ข้อมูลผิดพลาดทำให้เกิดการไม่ตอบสนองต่อการเรียกใช้งานดูเว็บไซต์`,
          icon: 'warning',
          color: 'red',
          onlycancel: true
        }
      })
    }
  }

  const dialogMessage = (
    // ไม่เอาใส่ undefined
    q: any,
    title: string,
    message: string,
    icon: string,
    textOk: string,
    color: string,
    ok?: Function,
    cancel?: Function
  ) => {
    q.dialog({
      component: CustomComponent,
      componentProps: {
        title: title,
        message: message,
        icon: icon,
        color: color,
        textOk: textOk
      }
    })
      .onOk(() => {
        if (ok != undefined) ok()
      })
      .onCancel(() => {
        if (cancel != undefined) cancel()
      })
  }

  function modalDelete(q: any, title: string, message: string, ok: Function, cancel?: Function) {
    q.dialog({
      title: `<span class="text-red">${title}</span>`,
      message: `<span class="text-black">${message}</span>`,
      cancel: {
        flat: true,
        color: 'grey-14'
      },
      ok: {
        color: 'red-5'
      },
      focus: 'none',
      persistent: true,
      html: true
    })
      .onOk(() => {
        ok()
      })
      .onCancel(() => {
        if (cancel != undefined) cancel()
      })
      .onDismiss(() => {})
  }

  function modalConfirm(q: any, title: string, message: string, ok: Function, cancel?: Function) {
    q.dialog({
      title: `<span class="text-primary">${title}</span>`,
      message: `<span class="text-black">${message}</span>`,
      cancel: {
        flat: true,
        color: 'grey'
      },
      ok: {
        color: 'primary'
      },
      focus: 'none',
      persistent: true,
      html: true
    })
      .onOk(() => {
        ok()
      })
      .onCancel(() => {
        if (cancel != undefined) cancel()
      })
      .onDismiss(() => {})
  }

  function modalError(q: any, title: string, message: string, ok?: Function) {
    q.dialog({
      title: `<span class="text-primary">${title}</span>`,
      message: `<span class="text-black">${message}</span>`,
      ok: {
        push: true,
        color: 'primary'
      },
      focus: 'none',
      persistent: true,
      html: true
    })
      .onOk(() => {
        if (ok != undefined) ok()
      })
      .onCancel(() => {})
      .onDismiss(() => {})
  }

  const dateText = (val: Date) => {
    if (val != null) {
      return date2Thai(val)
    } else {
      return '-'
    }
  }

  const weekThai = (val: Number) => {
    switch (val) {
      case 0:
        return 'วันอาทิตย์'
      case 1:
        return 'วันจันทร์'
      case 2:
        return 'วันอังคาร'
      case 3:
        return 'วันพุธ'
      case 4:
        return 'วันพฤหัสบดี'
      case 5:
        return 'วันศุกร์'
      case 6:
        return 'วันเสาร์'
      default:
        return '-'
    }
  }

  const genColor15 = (val: number) => {
    val = val % 15
    switch (val) {
      case 1:
        return 'pink'
      case 2:
        return 'purple'
      case 3:
        return 'deep-purple'
      case 4:
        return 'indigo'
      case 5:
        return 'blue'
      case 6:
        return 'light-blue'
      case 7:
        return 'cyan'
      case 8:
        return 'teal'
      case 9:
        return 'green'
      case 10:
        return 'light-green'
      case 11:
        return 'amber'
      case 12:
        return 'orange'
      case 13:
        return 'deep-orange'
      case 14:
        return 'brown'
      case 0:
        return 'blue-grey'
      default:
        return ''
    }
  }

  const statusCandidate = (val: string) => {
    switch (val) {
      case 'register':
        return 'ยังไม่สมัครสอบ'
      case 'checkRegister':
        return 'รอยืนยันสถานะการสมัคร'
      case 'payment':
        return 'ชำระค่าสมัครสอบ'
      case 'rejectRegister':
        return 'คุณสมบัติสมัครสอบไม่ผ่าน'
      case 'checkPayment':
        return 'รอเจ้าหน้าที่ตรวจสอบหลักฐานชำระเงิน'
      case 'rejectPayment':
        return 'หลักฐานชำระเงินไม่ถูกต้อง'
      case 'checkSeat':
        return 'ได้รับใบสมัครแล้ว'
      case 'checkPoint':
        return 'ติดตามประกาศทาง Website'
      case 'done':
        return 'ผลการสอบ'
      case 'waiver':
        return 'สละสิทธิ์สอบ'
      default:
        return '-'
    }
  }

  /**
   * แปลงช่วงวันที่ถ้า2ค่าเป็นวันเดียวกันจะโชววันเดียวแต่ถ้าไม่เท่ากันจะแสดงเป็นช่วง
   * @param val ช่วงวันที่
   */
  const dateThaiRange = (val: [Date, Date]) => {
    if (val === null) {
      return ''
    } else if (date2Thai(val[0]) === date2Thai(val[1])) {
      return `${date2Thai(val[0])}`
    } else {
      return `${date2Thai(val[0])} - ${date2Thai(val[1])}`
    }
  }

  /**
   * แปลงช่วงเดือนถ้า2ค่าเป็นวันเดียวกันจะโชววันเดียวแต่ถ้าไม่เท่ากันจะแสดงเป็นช่วง
   * @param val ช่วงเดือน
   */
  const monthThaiRange = (val: DataDateMonthObject[]) => {
    if (val === null || val[0] === null || val[1] === null) {
      return ''
    } else if (
      monthYear2Thai(val[0].month, val[0].year) === monthYear2Thai(val[1].month, val[1].year)
    ) {
      return `${monthYear2Thai(val[0].month, val[0].year)}`
    } else {
      return `${monthYear2Thai(val[0].month, val[0].year)} - ${monthYear2Thai(
        val[1].month,
        val[1].year
      )}`
    }
  }

  return {
    calAge,
    calAgeYear,
    date2Thai,
    dateToISO,
    notify,
    notifyError,
    dateText,
    monthYear2Thai,
    success,
    weekThai,
    genColor15,
    textToPhone,
    textToFax,
    dateThaiRange,
    monthThaiRange,
    modalDelete,
    modalConfirm,
    modalError,
    statusCandidate,
    messageError
  }
})
