require 'digest/md5'

class Migrate

	attr_accessor :depends
	attr_reader :queries, :query, :model

	def delta
		`php #{@root}/cli/delta.php --pipeline_source #{@source} --type #{@query} --pipeline_id #{@pipeline_id} #{@last_query}`
	end

	def export
		`php #{@root}/cli/export.php #{@last_query} #{@depends} --type #{@query} --pipeline_id #{@pipeline_id} --pipeline_source`
	end

	def import
		`php #{@root}/cli/import.php #{@last_query} --depends #{@depends} --flushall --noprogress --nodialog --type #{@model} #{@pipeline_source} --pipeline_id #{@pipeline_id} --pipeline_source`
	end

	def go(query, model, last = false)
		@query = query
		@model = model
		self.export
		@depends = query
		if last
			self.last_query
		end
		self.import
	end

	def initialize
		@depends = nil
		@root = File.dirname(File.dirname(__FILE__))
		@last_query = nil
		@model = nil
		@pipeline_id = Digest::MD5.hexdigest(Time.now.to_f.to_s)
		@pipeline_source = nil
		@queries = {
			 :Catalog => :dim_catalog,
			 :Label => :dim_label,
			 :Subaccount => :dim_subaccount,
			 :Isrc => :dim_isrc,
			 :Artist => :dim_artist,
			 :Owner => :dim_owner,
			 :TopArtists => :top_artists,
			 :TopReleases => :top_releases
		}
		@query = nil
		@source = ''
	end

	def pipeline_source=(args)
		if args.pipeline_source
			@pipeline_source = '--pipeline_source ' + args.pipeline_source
		end
	end

	def last_query
		@last_query = '--end'
	end

	def model=(args)
		if (args.model != nil) && (@queries.has_key? args.model.to_sym)
			@model = args.model
		else
			raise 'The specified model does not exist'
		end
	end

	def query=args
		if (@model == nil)
			self.model = args
		end
		@query = @queries[@model.to_sym]
	end

	def source=args
		if (args.source != nil)
			@source = args.source
		else
			@source = '20131205'
		end
	end

end

namespace :migrate do

	@Migrate = Migrate.new

	task :artist => [:label] do
		@Migrate.go 'dim_artist', 'Artist', true
	end

	task :catalog do
		@Migrate.go 'dim_catalog', 'Catalog', true
	end

	task :country do
		@Migrate.go 'dim_country', 'Country', true
	end

	task :day do
		@Migrate.go 'dim_day', 'Day', true
	end

	task :store do
		@Migrate.go 'dim_store', 'Store', true
	end	

	task :delta, [:model, :source] do |t, args|
		@Migrate.query = args
		@Migrate.source = args
		@Migrate.last_query
		@Migrate.delta
	end

	task :import, [:model, :pipeline_source] do |t, args|
		@Migrate.model = args
		@Migrate.pipeline_source = args
		@Migrate.last_query
		@Migrate.import
	end

	task :isrc do
		@Migrate.go 'dim_isrc', 'Isrc', true
	end

	task :label do
		@Migrate.go 'dim_label', 'Label'
	end

	task :model, [:model] do |t, args|
		@Migrate.query = args
		@Migrate.export
		@Migrate.depends = @Migrate.query
		@Migrate.last_query
		@Migrate.import
	end

	task :release do
		@Migrate.go 'dim_release', 'Release'
	end

	task :top_artists do
		@Migrate.go 'top_artists', 'TopArtists', true
	end

	task :top_releases do
		@Migrate.go 'top_releases', 'TopReleases', true
	end	

end