# frozen_string_literal: true

##
# Use this factory for FileMetadata for Files in valkyrie.
FactoryBot.define do
  factory :hyrax_file_metadata, class: 'Hyrax::FileMetadata', aliases: [:file_metadata] do
    transient do
      use { nil }
      visibility_setting { nil }
    end

    after(:build) do |file_metadata, evaluator|
      if evaluator.visibility_setting
        Hyrax::VisibilityWriter
          .new(resource: file_metadata)
          .assign_access_for(visibility: evaluator.visibility_setting)
      end
      file_metadata.pcdm_use = Hyrax::FileMetadata::Use.uri_for(use: evaluator.use) if evaluator.use
    end

    after(:create) do |file_metadata, evaluator|
      if evaluator.visibility_setting
        writer = Hyrax::VisibilityWriter.new(resource: file_metadata)
        writer.assign_access_for(visibility: evaluator.visibility_setting)
        writer.permission_manager.acl.save
      end
    end

    trait :public do
      transient do
        visibility_setting { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC }
      end
    end

    trait :original_file do
      use { Hyrax::FileMetadata::Use.uri_for(use: :original_file) }
    end

    trait :thumbnail do
      use { Hyrax::FileMetadata::Use.uri_for(use: :thumbnail_file) }
    end

    trait :extracted_text do
      use { Hyrax::FileMetadata::Use.uri_for(use: :extracted_file) }
    end

    trait :service_file do
      use { Hyrax::FileMetadata::Use.uri_for(use: :service_file) }
    end

    trait :image do
      mime_type { 'image/png' }
    end

    trait :audio_file do
      mime_type { 'audio/x-wave' }
    end

    trait :video_file do
      mime_type { 'video/mp4' }
    end

    trait :with_file do
      transient do
        file { FactoryBot.create(:uploaded_file, file: File.open(Hyrax::Engine.root + 'spec/fixtures/world.png')) }
        file_set { FactoryBot.valkyrie_create(:hyrax_file_set) }
        user { FactoryBot.create(:user) }
      end

      after(:build) do |file_metadata, evaluator|
        file_metadata.label = evaluator.file.uploader.filename
        file_metadata.mime_type = evaluator.file.uploader.content_type if file_metadata.mime_type == Hyrax::FileMetadata::GENERIC_MIME_TYPE
        file_metadata.original_filename = evaluator.file.uploader.filename
        file_metadata.recorded_size = evaluator.file.uploader.size
        file_metadata.file_set_id = evaluator.file_set.id
      end

      before(:create) do |file_metadata, evaluator|
        saved = Hyrax.storage_adapter.upload(resource: evaluator.file_set,
                                             file: evaluator.file.uploader.file,
                                             original_filename: evaluator.file.uploader.filename)
        file_metadata.file_identifier = saved.id
      end

      after(:create) do |file_metadata, evaluator|
        Hyrax::ValkyrieUpload.new.add_file_to_file_set(file_set: evaluator.file_set,
                                                       file_metadata: file_metadata,
                                                       user: evaluator.user)
      end
    end
  end
end