# frozen_string_literal: true

class Export < ApplicationRecord
  belongs_to :user

  enum :status, { created: 0, processing: 1, completed: 2, failed: 3 }
  enum :file_format, { json: 0, gpx: 1, archive: 2 }
  enum :file_type, { points: 0, user_data: 1 }

  validates :name, presence: true

  has_one_attached :file

  after_commit -> { ExportJob.perform_later(id) }, on: :create, unless: -> { user_data? || archive? }
  after_commit -> { remove_attached_file }, on: :destroy

  def process!
    Exports::Create.new(export: self).call
  end

  def migrate_to_new_storage
    file.attach(io: File.open("public/#{url}"), filename: name)
    update!(url: nil)

    File.delete("public/#{url}")
  rescue StandardError => e
    Rails.logger.debug("Error migrating export #{id}: #{e.message}")
  end

  private

  def remove_attached_file
    file.purge_later

    File.delete("public/#{url}")
  rescue StandardError => e
    Rails.logger.debug("Error removing export #{id}: #{e.message}")
  end
end
