class Champs::DepartementChamp < Champs::TextChamp store_accessor :value_json, :code_region # TODO: if: -> { validate_champ_value? || validation_context == :prefill } validate :value_in_departement_names, unless: -> { value.nil? } validate :external_id_in_departement_codes, unless: -> { external_id.nil? } before_save :store_code_region def for_export(path = :value) case path when :code code when :value name end end def to_s formatted_value end def for_tag(path = :value) case path when :code code when :value formatted_value end end def for_api formatted_value end def for_api_v2 formatted_value.tr('–', '-') end def selected code end def code external_id || APIGeoService.departement_code(name) end def name maybe_code_and_name = value&.match(/^(\w{2,3}) - (.+)/) if maybe_code_and_name maybe_code_and_name[2] else value end end def code_region APIGeoService.region_code_by_departement(code) end def value=(code) if [2, 3].include?(code&.size) self.external_id = code super(APIGeoService.departement_name(code)) elsif code.blank? self.external_id = nil super(nil) else self.external_id = APIGeoService.departement_code(code) super(code) end end private def formatted_value blank? ? "" : "#{code} – #{name}" end def value_in_departement_names return if value.in?(APIGeoService.departements.pluck(:name)) errors.add(:value, :not_in_departement_names) end def external_id_in_departement_codes return if external_id.in?(APIGeoService.departements.pluck(:code)) errors.add(:external_id, :not_in_departement_codes) end def store_code_region self.code_region = code_region end end