class Plan
  attr_accessor :key, :attributes

  def initialize(key, attributes = {})
    @key = key.to_sym
    @attributes = attributes
  end

  def name
    attributes[:name]
  end

  def id
    attributes[:id]
  end

  def price
    attributes[:price]
  end

  def active
    attributes[:active]
  end

  def version
    attributes[:version]
  end

  class << self
    def config
      Hashie::Mash.new(PLAN_CONFIG)
    end

    def default_trial_period
      (config['trial_period'] || 14).days
    end

    def default_pricing_version
      config['default_pricing_version']
    end

    def default_plans
      load_active_plans + load_inactive_plans
    end

    def all_plans
      default_plans
    end

    def active_plans
      all_plans.select(&:active)
    end

    def paid_plan
      active_plans.first
    end

    def inactive_plans
      all_plans.reject(&:active)
    end

    def trial_plan
      all_plans.detect { |plan| plan.key == :trial }
    end

    def plans_of_version(version)
      all_plans.select { |plan| plan.version == version }
    end

    def find_by_key(key)
      key = key.to_sym
      all_plans.detect { |plan| plan.key == key }.dup
    end

    # #helpers

    def load_active_plans
      result = []
      Plan.config.active.each_pair do |version, plans|
        plans.each_pair do |key, attributes|
          result << Plan.new(key, attributes.merge(active: true, version: version))
        end
      end
      result
    end

    def load_inactive_plans
      result = []
      Plan.config.inactive.each_pair do |version, plans|
        plans.each_pair do |key, attributes|
          result << Plan.new(key, attributes.merge(active: false, version: version))
        end
      end
      result
    end
  end
end
