<template>
  <UiContainer class="flex py-[15px] xl:py-20 sm:py-0">
    <div class="w-full sm:w-[80%] mx-auto my-auto xl:w-full xl:px-12">
      <div class="space-25-55">
        <div class="flex flex-wrap-reverse gap-y-4 justify-between">
          <h2 class="h2-bold-bounded">
            {{ $t("sign_up") }}
          </h2>
          <button
            class="h-[40px] sm:h-[43px] px-[10px] sm:px-[17px] border border-gray dark:border-button-disabled text-gray dark:text-button-disabled hover:bg-gray transition-all hover:text-white rounded-[8px] cursor-pointer"
            @click="menuStore.navigateToItem()">
            {{ $t("back_to_home") }}
          </button>
        </div>
        <div class="space-y-[25px] sm:space-y-[30px]">
          <p>{{ $t("current_information") }}</p>
          <div class="grid grid-cols-1 md:grid-cols-2 gap-[30px]">
            <CheckoutInput :id="1" v-model="user.data.name" :validation="nameValidation"
                           :validation-text="$t('enter_correct_data')" :placeholder="$t('first_name')">
              {{ $t("first_name") }}
            </CheckoutInput>
            <CheckoutInput :id="1" v-model="user.data.surname" :validation="surnameValidation"
                           :validation-text="$t('enter_correct_data')" :placeholder="$t('last_name')">
              {{ $t("last_name") }}
            </CheckoutInput>
            <CheckoutInput :id="1" v-model="user.data.email" :validation="emailValidation"
                           :validation-text="$t('enter_correct_data')" :placeholder="$t('email')">
              {{ $t("email") }}
            </CheckoutInput>
            <div ref="dropdownRef" class="space-y-[15px]">
              <p class="pl-6">
                {{ $t("phone") }}
              </p>
              <div>
                <div class="flex items-center border border-block rounded-lg">
                  <div
                    class="relative z-50 bg-inherit ring-0 cursor-pointer focus:ring-0 outline-none focus-visible:ring-0">
                    <div class="px-[25px]" @click="dropCountry = !dropCountry">
                      <div
                        class="flex items-center gap-2 text-sm sm:text-xl uppercase text-text-light dark:text-text-dark">
                        <span :class="[dropCountry && 'rotate-180', 'transition-all']">
                          <i class="uil uil-angle-down text-2xl font-light cursor-pointer" /></span>
                        <p class="text-sm sm:text-xl">
                          {{ menuStore.selectedPhoneCountry.iso_code }}
                        </p>
                      </div>
                    </div>

                    <div v-if="dropCountry"
                         class="mt-2 absolute bg-bg-light dark:bg-bg-dark rounded-[5px] ring-0 cursor-pointer w-[130px] sm:w-full border border-button py-[10px] px-[5px] overflow-hidden">
                      <div class="overflow-y-auto h-[200px] w-full">
                        <p v-for="item in menuStore.countries" :key="item.iso_code"
                           class="w-full truncate whitespace-nowrap overflow-hidden hover:bg-block dark:hover:bg-button pl-2 py-2 text-base text-text-light dark:text-text-dark rounded-[5px]"
                           :title="item.name" @click="
                             () => {
                               menuStore.selectedPhoneCountry = item;
                               dropCountry = false;
                             }
                           ">
                          {{ item.name }}
                        </p>
                      </div>
                    </div>
                  </div>
                  <p class="text-sm sm:text-xl font-normal">
                    {{ menuStore.selectedPhoneCountry.call_prefix }}
                  </p>
                  <input id="phone" v-model="user.data.phone" :placeholder="$t('phone')" type="text"
                         class="text-sm sm:text-xl placeholder:text-gray dark:placeholder:text-button-disabled text-bg-dark dark:text-bg-light px-6 h-[50px] sm:h-[67px] w-full focus:outline-none focus:ring-0">
                </div>
                <p v-if="!phoneValidation && phoneValidation != null" class="mt-2 text-xs text-red-600">
                  {{ $t('enter_correct_data') }}
                </p>
              </div>
            </div>
            <div class="space-y-[15px]">
              <p class="pl-6">
                {{ $t("account_type") }}
              </p>
              <USelect v-model="selectedType" :items="component.front_section_lang
                && component.front_section_lang[0].data.account_types
              " value-key="name" :searchable="false" :ui="{
                base: 'bg-inherit ring-0 cursor-pointer w-auto focus:ring-0 outline-none focus-visible:ring-0 h-[50px] sm:h-[67px] w-full p-0',
                trailing: 'hidden w-full',
                viewport: 'ring-0 min-w-full',
                content:
                  'bg-bg-light dark:bg-bg-dark ring-0 border border-button',
                leading:
                  'left-1/2 top-1/2 transform -translate-x-1/2 -translate-y-1/2 p-0 w-full',
                group: 'px-[5px] py-[10px]',
                item: 'hover:bg-block dark:hover:bg-button rounded-[5px] data-highlighted:not-data-disabled:before:bg-button/50 min-w-full',
              }">
                <template #leading="{ modelValue }">
                  <div
                    class="flex items-center justify-between gap-2 uppercase text-sm sm:text-xl border border-block placeholder:text-gray dark:placeholder:text-button-disabled text-bg-dark dark:text-bg-light rounded-lg px-6 w-full h-[50px] sm:h-[67px]">
                    <p class="truncate whitespace-nowrap">
                      {{
                        component.front_section_lang
                          && component.front_section_lang[0].data.account_types.find(
                            (item) => item.name === modelValue,
                          )?.name
                      }}
                    </p>
                    <span>
                      <i class="uil uil-angle-down text-2xl font-light cursor-pointer" /></span>
                  </div>
                </template>

                <template #item="{ item }">
                  <div class="flex items-center gap-2 cursor-pointer min-w-full">
                    <p
                      class="truncate whitespace-nowrap text-sm sm:text-xl font-medium uppercase text-text-light dark:text-text-dark opacity-100">
                      {{ item.name }}
                    </p>
                  </div>
                </template>
              </USelect>
            </div>
            <div class="space-y-[15px]">
              <p class="pl-6">
                {{ $t("partner_code") }}
              </p>
              <input :placeholder="$t('placeholder_password')" type="text"
                     class="border border-block placeholder:text-gray dark:placeholder:text-button-disabled text-bg-dark dark:text-bg-light rounded-lg px-6 h-[50px] sm:h-[67px] w-full focus:outline-none focus:ring-0 focus:border-2">
            </div>
          </div>
        </div>
      </div>
      <div class="py-[25px] sm:py-12 border-b border-gray flex justify-center w-full">
        <UiButtonArrow type="fill" :arrow="true" @click="sendForm()">
          {{
            $t("sign_up")
          }}
        </UiButtonArrow>
      </div>
      <div class="mt-[25px] sm:mt-[30px] w-full flex justify-center gap-3">
        <p class="cursor-pointer hover:underline transition-all">
          {{ $t("is_account") }}
        </p>
        <nuxt-link
          :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getLoginMenu()?.id, slug: menuStore.getLoginMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
          <p class="text-button cursor-pointer hover:text-button-hover">
            {{ $t("login") }}
          </p>
        </nuxt-link>
      </div>
    </div>
  </UiContainer>
</template>

<script lang="ts" setup>
import { onClickOutside } from '@vueuse/core'
import CheckoutInput from '../ui/CheckoutInput.vue'
import type { GenericResponse } from '~/types'

const props = defineProps<{
  component: {
    id: number
    name: string
    img: string[]
    component_name: string
    is_no_lang: boolean
    page_name: string
    front_section_lang: {
      data: {
        account_types: {
          id: number
          name: string
          value: string
        }[]
      }
      id_front_section: number
      id_lang: number
    }[]
  }
}>()

const menuStore = useMenuStore()
const dropdownRef = ref(null)
const dropCountry = ref()

const user = ref({
  data: {
    name: '',
    surname: '',
    email: '',
    phone: '',
  },
})

const nameValidation = ref<boolean | null>(null)
const surnameValidation = ref<boolean | null>(null)
const emailValidation = ref<boolean | null>(null)
const phoneValidation = ref<boolean | null>(null)
const codeValidation = ref<boolean | null>(null)

const selectedType = ref()
if (props.component.front_section_lang)
  selectedType.value
    = props.component.front_section_lang[0].data.account_types[0].name

const sendForm = async () => {
  const phoneNum = `${menuStore.selectedPhoneCountry.call_prefix}${user.value.data.phone}`.replaceAll(' ', '').trim()
  console.log(phoneNum)

  nameValidation.value = validation(user.value.data.name, 1, 49)
  surnameValidation.value = validation(user.value.data.surname, 1, 49)
  emailValidation.value = validation(user.value.data.email, 1, 49, REGEX_EMAIL)
  phoneValidation.value = validation(phoneNum, 1, 49, REGEX_PHONE)
  // codeValidation.value = validation(vCode.value as string, 1, 49);

  const selectedTypeValue = props.component.front_section_lang[0].data.account_types.find(item => item.name === selectedType.value)?.value

  if (nameValidation.value && surnameValidation.value && emailValidation.value && phoneValidation.value && codeValidation) {
    try {
      await useMyFetch<GenericResponse<object>>(
        `/api/public/register/new_link?customer_type=${selectedTypeValue}`,
        {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            email: user.value.data.email,
            first_name: user.value.data.name,
            last_name: user.value.data.surname,
            phone_number: phoneNum,
            // partner_code: vCode.value,
            customer_type: selectedType.value,
          }),
          onErrorOccured: (_, status) => {
            throw new Error(`HTTP error: ${status}`)
          },
        },
      )
    }

    // successRegister.value = true;
    // isLoader.value = false;
    catch (error) {
      console.error('getList error:', error)
    }
  }
}

onClickOutside(dropdownRef, () => {
  dropCountry.value = false
})
</script>
