# frozen_string_literal: true

require "digest/sha1"

class ExternalUploadStub < ActiveRecord::Base
  CREATED_EXPIRY_HOURS = 1
  UPLOADED_EXPIRY_HOURS = 24
  FAILED_EXPIRY_HOURS = 48

  belongs_to :created_by, class_name: 'User'

  validates :filesize, numericality: {
    allow_nil: false, only_integer: true, greater_than_or_equal_to: 1
  }

  scope :expired_created, -> {
    where(
      "status = ? AND created_at <= ?",
      ExternalUploadStub.statuses[:created],
      CREATED_EXPIRY_HOURS.hours.ago
    )
  }

  scope :expired_uploaded, -> {
    where(
      "status = ? AND created_at <= ?",
      ExternalUploadStub.statuses[:uploaded],
      UPLOADED_EXPIRY_HOURS.hours.ago
    )
  }

  before_create do
    self.unique_identifier = SecureRandom.uuid
    self.status = ExternalUploadStub.statuses[:created] if self.status.blank?
  end

  def self.statuses
    @statuses ||= Enum.new(
      created: 1,
      uploaded: 2,
      failed: 3,
    )
  end

  # TODO (martin): Lifecycle rule would be best to clean stuff up in the external
  # systems, I don't think we really want to be calling out to the external systems
  # here right?
  def self.cleanup!
    expired_created.delete_all
    expired_uploaded.delete_all
  end
end

# == Schema Information
#
# Table name: external_upload_stubs
#
#  id                         :bigint           not null, primary key
#  key                        :string           not null
#  original_filename          :string           not null
#  status                     :integer          default(1), not null
#  unique_identifier          :uuid             not null
#  created_by_id              :integer          not null
#  upload_type                :string           not null
#  created_at                 :datetime         not null
#  updated_at                 :datetime         not null
#  multipart                  :boolean          default(FALSE), not null
#  external_upload_identifier :string
#  filesize                   :bigint           not null
#
# Indexes
#
#  index_external_upload_stubs_on_created_by_id               (created_by_id)
#  index_external_upload_stubs_on_external_upload_identifier  (external_upload_identifier)
#  index_external_upload_stubs_on_key                         (key) UNIQUE
#  index_external_upload_stubs_on_status                      (status)
#