import {AnyJson} from '~/types/interfaces'
import {QUERY_TYPE} from "~/types/enums";
import DataProvider from "~/services/data/dataProvider";

/**
 * @category composables/data
 * @param $dataProvider
 * Composable class qui regroupe les utils des adresses postales
 */
export function useAddressPostalUtils($dataProvider: DataProvider) {

  /**
   * Fonction de recherche qui utilise l'API gouvernematal pour autocompléter les CP et villes.
   * @param research
   * @param field
   * @private
   */
  async function searchFunction(research: string, field: string): Promise<Array<AnyJson>> {
    if (research) {
      const response = await $dataProvider.invoke({
        type: QUERY_TYPE.DEFAULT,
        url: `https://api-adresse.data.gouv.fr/search/?q=${research}&type=municipality&autocomplete=1&limit=20`,
        params: {
          noXaccessId: true
        }
      })
      const apiResponse = response.data.features.map((data: AnyJson) => data.properties)

      // Par défaut on insère les valeurs que l'utilisateur a écrit, car un nom de ville ou de CP peut être absent de l'API
      const defaultResponse = []
      if (field === 'addressPostal.addressCity') {
        defaultResponse.push({id: 0, postcode: null, city: research})
      } else {
        defaultResponse.push({id: 0, postcode: research, city: null})
      }

      return defaultResponse.concat(apiResponse)
    }
    return []
  }

  /**
   * Fonction permettant de mettre à jour le repo par rapport à la réponse (objet) de l'autocomplete
   * @param value
   * @param updateRepository
   * @private
   */
  function updateCpAddress(value: AnyJson, updateRepository: Function): void {
    //Si une valeur est présente
    if (value) {
      if (value.city)
        updateRepository(value.city, 'addressPostal.addressCity')
      if (value.postcode)
        updateRepository(value.postcode, 'addressPostal.postalCode')
    } else {
      //Cas où on efface les valeurs des champs
      updateRepository(null, 'addressPostal.addressCity')
      updateRepository(null, 'addressPostal.postalCode')
    }
  }

  return {
    searchFunction,
    updateCpAddress
  }
}
