<template>
  <q-dialog ref="dialogRef" @hide="onDialogHide">
    <q-card class="q-dialog-plugin overflow-hidden" style="width: 800px">
      <DefaultDialogHeader :title="title" @close="onDialogCancel" />
      <q-form ref="formRef" @submit="onOKClick">
        <q-card-section class="row q-col-gutter-sm">
          <q-input
            v-model="form.name"
            :label="$t('common.terms.name')"
            :rules="[inputRules.required]"
            class="col-md-6 col-12"
          />
          <CountrySelect
            ref="countrySelectRef"
            v-model="selectedCountry"
            :label="$t('ui.navigation.country')"
            :rules="[inputRules.required]"
            class="col-md-6 col-12"
          />
          <StateSelect
            v-model="selectedState"
            :country="selectedCountry"
            :label="$t('ui.navigation.state')"
            :rules="[inputRules.required]"
            class="col-md-6 col-12"
            @selected-country-id="countrySelectRef.selectCountryById($event)"
          />
          <q-select
            v-model="selectedStatus"
            :label="$t('common.terms.status')"
            :options="statusOptions"
            :rules="[inputRules.required]"
            class="col-md-6 col-12"
          />
        </q-card-section>
        <q-card-actions align="center">
          <q-btn color="primary" label="Cancel" @click="onDialogCancel" />
          <q-space />
          <q-btn
            color="primary"
            label="OK"
            :type="'submit'"
            :loading="loading"
            :disable="!hasUpdatedFields"
          />
        </q-card-actions>
      </q-form>
    </q-card>
  </q-dialog>
</template>
<script setup>
import { ref, useTemplateRef, onMounted, watch } from "vue";
import { useInputRules } from "src/composables/useInputRules";
import { useDialogPluginComponent } from "quasar";
import { useI18n } from "vue-i18n";
import { createCity, updateCity } from "src/api/city";
import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";

import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
import CountrySelect from "src/components/regions/CountrySelect.vue";
import StateSelect from "src/components/regions/StateSelect.vue";

defineEmits([
  // REQUIRED; need to specify some events that your
  // component will emit through useDialogPluginComponent()
  ...useDialogPluginComponent.emits,
]);

const { city, title } = defineProps({
  city: {
    type: Object,
    default: null,
  },
  title: {
    type: Function,
    default: () => useI18n().t("common.terms.title"),
  },
});

const { t } = useI18n();
const { inputRules } = useInputRules();

const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
  useDialogPluginComponent();

const formRef = useTemplateRef("formRef");
const countrySelectRef = useTemplateRef("countrySelectRef");

const { form, getUpdatedFields, hasUpdatedFields } = useFormUpdateTracker({
  name: city ? city.name : "",
  country_id: city ? city.country_id : null,
  state_id: city ? city.state_id : null,
  status: city ? city.status : "ACTIVE",
});

const loading = ref(false);

const selectedCountry = ref(null);
const selectedState = ref(null);
const selectedStatus = ref({
  label: t("common.status.active"),
  value: "ACTIVE",
});
const statusOptions = ref([
  { label: t("common.status.active"), value: "ACTIVE" },
  { label: t("common.status.inactive"), value: "INACTIVE" },
]);

const onOKClick = async () => {
  if (!(await formRef.value.validate())) {
    return;
  }

  if (city) {
    loading.value = true;
    try {
      await updateCity(city.id, getUpdatedFields.value);
    } catch (error) {
      console.error(error);
      return;
    } finally {
      loading.value = false;
    }
    onDialogOK(true);
  } else {
    loading.value = true;
    try {
      await createCity({ ...form });
    } catch (error) {
      console.error(error);
      return;
    } finally {
      loading.value = false;
    }
    onDialogOK(true);
  }
};

watch(selectedStatus, () => {
  form.status = selectedStatus.value?.value;
});

watch(selectedCountry, () => {
  form.country_id = selectedCountry.value?.value;
});

watch(selectedState, () => {
  form.state_id = selectedState.value?.value;
});

onMounted(async () => {
  if (city) {
    selectedStatus.value = statusOptions.value.find(
      (status) => status.value === city.status,
    );
  }
});
</script>
