class Spell
	ARCANA = [:death, :fate, :forces, :life, :matter, :mind, :prime, :space, :spirit, :time]
	RANKS = ["Initiate", "Apprentice", "Disciple", "Adept", "Master"]
	ARCANA.each do |arcanum|
		attr_accessor arcanum
	end

	attr_accessor	:name,
					:practice,
					:primary_factor,
					:withstand,
					:suggested_rote_skills,
					:reaches,
					:adds,
					:rules_text,
					:cost,
					:pdf

	attr_accessor :authors

	def initialize(
		death: 0,
		fate: 0,
		forces: 0,
		life: 0,
		matter: 0,
		mind: 0,
		prime: 0,
		space: 0,
		spirit: 0,
		time: 0,
		name:,
		practice:,
		primary_factor:,
		withstand: nil,
		suggested_rote_skills:,
		reaches: [],
		rules_text:,
		authors:,
		adds: [],
		cost: nil,
		pdf:)

		@death = death
		@fate = fate
		@forces = forces
		@life = life
		@matter = matter
		@mind = mind
		@prime = prime
		@space = space
		@spirit = spirit
		@time = time
		@name = name
		@practice = practice
		@primary_factor = primary_factor
		@withstand = withstand
		@suggested_rote_skills = suggested_rote_skills
		@reaches = reaches
		@rules_text = rules_text
		@authors = authors
		@adds = adds
		@cost = cost
		@pdf = pdf
	end

	def primary_arcanum
		ARCANA.max { |arcanum1, arcanum2| self.send(arcanum1) <=> self.send(arcanum2) }
	end

	def full_title
		"#{name} (#{arcana_with_dots.join(', ')})"
	end

	def arcana
		ARCANA.select { |arcanum| self.send(arcanum) > 0}
	end

	def arcana_with_dots
		arcana.collect { |arcanum| arcanum_with_dots(arcanum) }
	end
	
	def arcanum_with_dots(arcanum)
		[arcanum, self.send(arcanum)].to_arcanum_with_dots
	end

	def render(rating_title = nil)
		puts "\t\tCompiling #{full_title} by #{authors.join(', ')}"
		pdf.outline.add_subsection_to(rating_title) do
			@pdf.outline.section full_title, :destination => @pdf.page_number
		end

		pdf.group do |g|
			unless rating_title.nil?
				g.font_size Awakened2069::FONT_SIZE_SECTION
				g.text rating_title
			end

			spell_ary = [{:text => "#{name} (", :font => "Lilith", :color => "004E6D", :size => Awakened2069::FONT_SIZE_SUBSECTION}]

			g.font_size Awakened2069::FONT_SIZE_BODY
			previous = false
			arcana.each do |arcanum|
				spell_ary << {:text => ", ", :font => "Lilith", :color => "004E6D", :size => Awakened2069::FONT_SIZE_SUBSECTION} if previous
				spell_ary << {:text => arcanum.to_s.titleize, :font => "Lilith", :color => "004E6D", :size => Awakened2069::FONT_SIZE_SUBSECTION}
				spell_ary << {:text => self.send(arcanum).to_dots, :color => "004E6D", :size => Awakened2069::FONT_SIZE_SUBSECTION, :character_spacing => -5}
			
				previous = true
			end

			spell_ary << {:text => " )", :font => "Lilith", :styles => [], :color => "004E6D", :size => Awakened2069::FONT_SIZE_SUBSECTION, :character_spacing => -3}

			g.formatted_text spell_ary

			g.formatted_text [
				{:text => "Practice: ", :styles => [:bold], :font => "Goudy"},
				{:text => practice, :font => "Goudy"},
			]

			g.formatted_text [
				{:text => "Primary Factor: ", :styles => [:bold], :font => "Goudy"},
				{:text => primary_factor, :font => "Goudy"},
			]

			g.formatted_text [
				{:text => "Withstand: ", :styles => [:bold], :font => "Goudy"},
				{:text => withstand, :font => "Goudy"},
			] if !withstand.nil?

			g.formatted_text [
				{:text => "Cost: ", :styles => [:bold], :font => "Goudy"},
				{:text => cost, :font => "Goudy"},
			] if !cost.nil?

			g.formatted_text [
				{:text => "Suggested Rote Skills: ", :styles => [:bold], :font => "Goudy"},
				{:text => suggested_rote_skills.join(', '), :font => "Goudy"},
			]

			g.formatted_text [
				{:text => authors.length == 1 ? "Author: " : "Authors: ", :styles => [:bold], :font => "Goudy"},
				{:text => authors.join(', '), :font => "Goudy"},
			]

			g.text rules_text, :inline_format => true

			reaches.each do |reach|
				g.formatted_text [
					{:text => "+#{reach[0]} Reach: ", :styles => [:bold], :font => "Goudy"},
					{:text => reach[1], :font => "Goudy"},
				]
			end

			adds.each do |add|
				g.formatted_text [
					{:text => "#{add[:verb] ? add[:verb] : "Add"} #{add[:arcana].collect { |arcanum, rating| [arcanum, rating].to_arcanum_with_dots }.to_list(:separator => add[:separator])}: ", :styles => [:bold], :font => "Goudy"},
					{:text => add[:effect], :font => "Goudy"},
				]
			end
		end
	end
end