class Users::CarteController < UsersController
  before_action only: [:show] do
    authorized_routes? self.class
  end

  def show
    @dossier = current_user_dossier

  rescue ActiveRecord::RecordNotFound
    flash.alert = t('errors.messages.dossier_not_found')
    redirect_to url_for(root_path)
  end

  def save
    safe_json_latlngs = clean_json_latlngs(params[:json_latlngs])
    dossier = current_user_dossier

    dossier.quartier_prioritaires.each(&:destroy)
    dossier.cadastres.each(&:destroy)

    if safe_json_latlngs.present?
      ModuleApiCartoService.save_qp! dossier, safe_json_latlngs
      ModuleApiCartoService.save_cadastre! dossier, safe_json_latlngs
    end

    dossier.update(json_latlngs: safe_json_latlngs)

    redirect_to modifier_dossier_path(dossier)
  end

  def get_position
    begin
      etablissement = current_user_dossier.etablissement
    rescue ActiveRecord::RecordNotFound
      etablissement = nil
    end

    point = Carto::Geocodeur.convert_adresse_to_point(etablissement.geo_adresse) if etablissement.present?

    lon = '2.428462'
    lat = '46.538192'
    zoom = '13'

    if point.present?
      lon = point.x.to_s
      lat = point.y.to_s
    end

    render json: { lon: lon, lat: lat, zoom: zoom, dossier_id: params[:dossier_id] }
  end

  def get_qp
    render json: { quartier_prioritaires: ModuleApiCartoService.generate_qp(JSON.parse(params[:coordinates])) }
  end

  def get_cadastre
    render json: { cadastres: ModuleApiCartoService.generate_cadastre(JSON.parse(params[:coordinates])) }
  end

  def self.route_authorization
    {
      states: [:brouillon, :en_construction],
      api_carto: true
    }
  end

  private

  def clean_json_latlngs(json_latlngs)
    # a polygon must contain at least 4 points
    # https://tools.ietf.org/html/rfc7946#section-3.1.6
    if json_latlngs.present?
      multipolygone = JSON.parse(json_latlngs)
      multipolygone.reject! { |polygone| polygone.count < 4 }
      if multipolygone.present?
        multipolygone.to_json
      end
    end
   end
end
