# frozen_string_literal: true

class Points::Create
  attr_reader :user, :params

  def initialize(user, params)
    @user = user
    @params = params.to_h
  end

  def call
    data = Points::Params.new(params, user.id).call

    deduplicated_data = data.uniq { |point| [point[:lonlat], point[:timestamp].to_i, point[:user_id]] }

    created_points = []

    deduplicated_data.each_slice(1000) do |location_batch|
      # rubocop:disable Rails/SkipsModelValidations
      result = Point.upsert_all(
        location_batch,
        unique_by: %i[lonlat timestamp user_id],
        returning: Arel.sql('id, timestamp, ST_X(lonlat::geometry) AS longitude, ST_Y(lonlat::geometry) AS latitude')
      )
      # rubocop:enable Rails/SkipsModelValidations

      created_points.concat(result)
    end

    created_points
  end
end
