require 'factory_girl_rails' include FactoryGirl::Syntax::Methods require 'dpla/map/factories' require 'open-uri' require 'resque/tasks'

require 'krikri/search_index'

krikri_dir = Gem::Specification.find_by_name('krikri').gem_dir require “#{krikri_dir}/app/models/krikri/original_record” require “#{krikri_dir}/spec/factories/krikri_original_record”

namespace :krikri do

def index_aggregation(agg)
  indexer = Krikri::QASearchIndex.new
  indexer.add agg.to_jsonld['@graph'].first
  indexer.commit
end

namespace :samples do

  # Note: The content of the sample original record does not actually
  # correspond to the content of the sample aggregation.
  desc 'Save a sample record to Marmotta and Solr'
  task :save_record => :environment do
    original_record = build(:oai_dc_record)
    original_record.save unless original_record.exists?

    provider_uri = Krikri::Provider.base_uri + '123'
    provider = Krikri::Provider.new(:rdf_subject => provider_uri).agent
    provider.label = 'Moomin Valley Historical Society'

    agg = build(:aggregation,
                :originalRecord => original_record.rdf_source,
                :provider => provider)

    agg.mint_id!('krikri_sample')

    # Save to Marmotta
    agg.save unless agg.exists?

    index_aggregation(agg)
  end

  desc 'Save an invalid sample record to Marmotta and Solr'
  task :save_invalid_record => :environment do
    original_record = build(:json_record)
    original_record.save unless original_record.exists?

    provider_uri = Krikri::Provider.base_uri + '456'
    provider = Krikri::Provider.new(:rdf_subject => provider_uri).agent
    provider.label = 'Snork Maiden Archives'

    agg = build(:aggregation,
                :originalRecord => ActiveTriples::Resource
                                    .new(original_record.rdf_subject),
                :sourceResource => build(:source_resource, title: nil),
                :provider => provider)

    agg.mint_id!('krikri_sample_invalid')

    # Save to Marmotta
    agg.save unless agg.exists?

    index_aggregation(agg)
  end

  desc 'Delete all sample records from Marmotta and Solr'
  task :delete_record => :environment do
    # Delete aggregation from Marmotta
    agg = DPLA::MAP::Aggregation.new
    agg.mint_id!('krikri_sample')
    agg.delete! if agg.exists?

    agg = DPLA::MAP::Aggregation.new
    agg.mint_id!('krikri_sample_invalid')
    agg.delete! if agg.exists?

    # Delete original records from Marmotta
    original_record = build(:oai_dc_record)
    original_record.delete! if original_record.exists?

    original_record = build(:json_record)
    original_record.delete! if original_record.exists?

    # Delete all sample records from Solr
    indexer = Krikri::QASearchIndex.new
    indexer.delete_by_query 'id:*krikri_sample*'
    indexer.commit
  end

  desc 'Save sample institution and harvest source'
  # the '=> :environment' dependency gives task access to ActiveRecord models
  task :save_institution => :environment do

    unless Krikri::Institution.find_by(name: 'Krikri Sample Institution')

      institution = Krikri::Institution.create(
        name: 'Krikri Sample Institution',
        notes: 'These are notes about the Krikri Sample Institution.'
      )

      Krikri::HarvestSource.create(
        institution_id: institution.id,
        name: 'OAI feed',
        source_type: 'OAI',
        metadata_schema: 'MARC',
        uri: 'http://www.example.com',
        notes: 'These are notes about the Krikri Sample Source.'
      )

    end
  end

  desc 'Delete sample institution and harvest source'
  task :delete_institution => :environment do
    # any harvest sources associated with sample institution will be
    # destroyed through dependent_destroy
    institution = Krikri::Institution.find_by(name: 'Krikri Sample Institution')
    institution.destroy if institution
  end
end

end