import { defineStore } from 'pinia'
import { ref, reactive } from 'vue'
import { useValidationStore } from '@/stores/validationStore'
import { usePiyangoYardimAmacliStore } from '../stores/piyangoYardimAmacliStore'

export const usePiyangoYardimAmacliValidationStore = defineStore(
  'piyangoYardimAmacliValidationStore',
  () => {
    const piyangoYardimAmacliStore = usePiyangoYardimAmacliStore()
    const validationStore = useValidationStore()

    const formChanged = ref<boolean>(false)
    const isFormValid = ref<boolean>(true)
    const invalidTexts = reactive<Record<string, any>>({})
    const emptyBilet = reactive<Record<string, any>>({})
    const allBiletInvalid = ref<boolean>(false)
    const biletInvalidMessages = ref<string[]>([])

    const IsAllBiletsEmpty = () => {
      for (let i = 0; i < piyangoYardimAmacliStore.yardimAmacliRakamlar.length; i++) {
        emptyBilet[piyangoYardimAmacliStore.yardimAmacliRakamlar[i].prefix] =
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              piyangoYardimAmacliStore.yardimAmacliRakamlar[i].prefix + 'RakamBaslangic'
            ]
          ) &&
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              piyangoYardimAmacliStore.yardimAmacliRakamlar[i].prefix + 'RakamBitis'
            ]
          ) &&
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              piyangoYardimAmacliStore.yardimAmacliRakamlar[i].prefix + 'RakamAdet'
            ]
          )
      }
    }

    const CheckBiletEmpty = () => {
      IsAllBiletsEmpty()
      var isvalid = true
      var count = 0
      Object.keys(emptyBilet).forEach((key) => {
        if (!emptyBilet[key]) {
          count++
        }
      })

      if (count === piyangoYardimAmacliStore.yardimAmacliRakamlar.length) isvalid = false

      if (isvalid) {
        isFormValid.value = true
        allBiletInvalid.value = false
      } else {
        biletInvalidMessages.value.push('Bilet alanları doldurulmamıştır.')
        isFormValid.value = false
        allBiletInvalid.value = true
      }
    }

    const CheckBiletSatir = () => {
      biletInvalidMessages.value = []
      var eksikHane: boolean = false
      var baslangicRakam: boolean = false
      var bitisRakam: boolean = false
      var bitisKucuk: boolean = false

      piyangoYardimAmacliStore.yardimAmacliRakamlar.forEach((data, i) => {
        //Baslangic Rakam sayisi
        if (
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBaslangic'
            ]
          ) &&
          piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
            data.prefix + 'RakamBaslangic'
          ].length < data.maxl
        ) {
          isFormValid.value = false
          if (!eksikHane) {
            eksikHane = true
            biletInvalidMessages.value.push(
              'Bilet numarası girilirken eksik hane girilmiş'
            )
          }
          invalidTexts[
            data.prefix + 'RakamBaslangic'
          ] = `Bilet numarası en az ${data.maxl} haneli olmalıdır`
        } else delete invalidTexts[data.prefix + 'RakamBaslangic']

        //Bitis Rakam sayisi
        if (
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBitis'
            ]
          ) &&
          piyangoYardimAmacliStore.piyangoYardimAmacliFormData[data.prefix + 'RakamBitis']
            .length < data.maxl
        ) {
          isFormValid.value = false
          if (!eksikHane) {
            eksikHane = true
            biletInvalidMessages.value.push(
              'Bilet numarası girilirken eksik hane girilmiş'
            )
          }
          invalidTexts[
            data.prefix + 'RakamBitis'
          ] = `Bilet numarası en az ${data.maxl} haneli olmalıdır`
        } else delete invalidTexts[data.prefix + 'RakamBitis']

        //Bitis numarasi girilmemis
        if (
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBaslangic'
            ]
          ) &&
          validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBitis'
            ]
          )
        ) {
          isFormValid.value = false
          if (!bitisRakam) {
            bitisRakam = true
            biletInvalidMessages.value.push(
              'Bilet numarası girilirken başlangıç numarası girilmiş, bitiş numarası girilmemiş.'
            )
          }
          invalidTexts[data.prefix + 'RakamBitis'] = 'Bitiş numarasını girmelisiniz.'
        } else {
          delete invalidTexts[data.prefix + 'RakamBitis']
        }

        //Baslangic numarasi girilmemis
        if (
          validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBaslangic'
            ]
          ) &&
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBitis'
            ]
          )
        ) {
          isFormValid.value = false
          if (!baslangicRakam) {
            baslangicRakam = true
            biletInvalidMessages.value.push(
              'Bilet numarası girilirken bitiş numarası girilmiş, başlangıç numarası girilmemiş.'
            )
          }
          invalidTexts[data.prefix + 'RakamBaslangic'] =
            'Başlangıç numarasını girmelisiniz.'
        } else {
          delete invalidTexts[data.prefix + 'RakamBaslangic']
        }

        //Baslangic numarasi Bitis numarasindan buyuk
        if (
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBaslangic'
            ]
          ) &&
          !validationStore.checkEmpty(
            piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
              data.prefix + 'RakamBitis'
            ]
          )
        ) {
          if (
            parseInt(
              piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
                data.prefix + 'RakamBaslangic'
              ]
            ) >=
            parseInt(
              piyangoYardimAmacliStore.piyangoYardimAmacliFormData[
                data.prefix + 'RakamBitis'
              ]
            )
          ) {
            isFormValid.value = false
            if (!bitisKucuk) {
              bitisKucuk = true
              biletInvalidMessages.value.push(
                'Bilet numarası girilirken bitiş numarası başlangıç numarasından küçük girilmiş.'
              )
            }
            invalidTexts[data.prefix + 'RakamBitis'] =
              'Bitiş numarasını başlangıç numarasından büyük olmalıdır.'
          } else {
            delete invalidTexts[data.prefix + 'RakamBitis']
          }
        }
      })
    }

    const FormCheck = (): boolean => {
      Object.assign(invalidTexts, {})
      CheckBiletEmpty()

      if (!allBiletInvalid.value) {
        CheckBiletSatir()
      }

      validationStore.IsFieldEmpty(
        piyangoYardimAmacliStore.piyangoYardimAmacliFormData,
        invalidTexts,
        'basimevi',
        'Lütfen Basımevi adını giriniz'
      )
      validationStore.IsFieldEmpty(
        piyangoYardimAmacliStore.piyangoYardimAmacliFormData,
        invalidTexts,
        'basimeviAdresi',
        'Lütfen Basımevi adresini giriniz'
      )
      validationStore.IsFieldEmpty(
        piyangoYardimAmacliStore.piyangoYardimAmacliFormData,
        invalidTexts,
        'birimSatisFiyati',
        'Lütfen Bilet birim satış fiyatını giriniz'
      )
      isFormValid.value = Object.keys(invalidTexts).length === 0
      return isFormValid.value
    }

    return {
      formChanged,
      isFormValid,
      invalidTexts,
      allBiletInvalid,
      biletInvalidMessages,
      CheckBiletEmpty,
      CheckBiletSatir,
      FormCheck
    }
  }
)
