<%
def version
  config = YAML.load(File.read(File.join(EVENTABLE_ROOT, 'VERSION.yml')))
  "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
end
-%>
class <%= "SetupEventable#{version.gsub('.','')}" -%> < ActiveRecord::Migration
<%
  tables = {
    :eventable_program_items => [
                                 [:event_id, 't.belongs_to :event'],
                                 [:user_id,  't.belongs_to :user'],
                                 [:start_at, 't.datetime :start_at'],
                                 [:end_at,   't.datetime :end_at']
                                ],
    :eventable_reviews => [
                           [:program_item_id, 't.belongs_to :program_item'],
                           [:review,          't.float :review'],
                           [:text,            't.text :text']
                          ],
    :eventable_prices => [
                           [:event_id, 't.belongs_to :event'],
                           [:text,     't.text :text'],
                           [:price,    't.decimal :price, :scale => 2, :precision => 6']
                          ],
    :eventable_opening_periods => [
                           [:event_id, 't.belongs_to :event'],
                           [:start_at, 't.datetime :start_at'],
                           [:end_at,   't.datetime :end_at']
                          ],
    :eventable_opening_times => [
                           [:period_id,     't.belongs_to :period'],
                           [:day_of_week,   't.integer :day_of_week'],
                           [:minutes_start, 't.integer :minutes_start'],
                           [:minutes_end,   't.integer :minutes_end'],
                          ],
    :eventable_categories => [
                              [:name,                't.string :name'],
                              [:description,         't.text :description'],
                              [:group,               't.string :group'],
                              [:avatar_file_name,    't.string :avatar_file_name'],
                              [:avatar_file_size,    't.integer :avatar_file_size'],
                              [:avatar_content_type, 't.string :avatar_content_type']
                          ],
    :eventable_categories_events => [
                                     [:event_id, 't.belongs_to :event'],
                                     [:category_id, 't.belongs_to :category']
                                    ]
  }
  indexes = {
    :eventable_program_items => [
                                 :event_id,
                                 :user_id
                                ],
    :eventable_reviews => [
                           :program_item_id
                          ],
    :eventable_prices => [
                          :event_id
                         ],
    :eventable_opening_periods => [
                                   :event_id,
                                   [:start_at, :end_at]
                                  ],
    :eventable_opening_times => [
                                 { :index => [:period_id, :day_of_week, :minutes_start, :minutes_end], :name => 'full_index' }
                                ],
    :eventable_categories_events => [
                                   :event_id,
                                   :category_id
                                  ],
  }
-%>
  def self.up
<%  tables.keys.each do |table| -%>
<%    cols = tables[table] -%>
<%    if ActiveRecord::Base.connection.table_exists?(table) -%>
    change_table(:<%= table -%>) do |t|
<%      existing_columns = ActiveRecord::Base.connection.columns(table).map(&:name) -%>
<%      cols.reject! { |c| existing_columns.include?(c.first.to_s) } -%>
<%    else -%>
    create_table(:<%= table -%>) do |t|
<%    end -%>
<%    cols.each do |c| -%>
      <%= c.last %>
<%    end -%>
    end

<%  end -%>
<%  indexes.keys.each do |table| -%>
<%    idxs = indexes[table] -%>
<%    if ActiveRecord::Base.connection.table_exists?(table) -%>
<%      existing_indexes = ActiveRecord::Base.connection.indexes(table).map{|c| c.columns.sort} -%>
<%      idxs.reject! { |c| existing_indexes.include?([*c].map(&:to_s).sort) } -%>
<%    end -%>
<%    idxs.each do |i| -%>
<%      if Hash === i -%>
    add_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%>
<%      else -%>
    add_index :<%= table %>, <%= i.inspect %>
<%      end -%>
<%    end -%>

<%  end -%>
  end

  def self.down
<%  indexes.keys.each do |table| -%>
<%    idxs = indexes[table] -%>
<%    idxs.each do |i| -%>
<%      if Hash === i -%>
    remove_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%>
<%      else -%>
    remove_index :<%= table %>, <%= i.inspect %>
<%      end -%>
<%    end -%>

<%  end -%>
<%  tables.keys.each do |table| -%>
<%    cols = tables[table] -%>
<%    if ActiveRecord::Base.connection.table_exists?(table) -%>
    change_table(:<%= table -%>) do |t|
<%      cols.each do |c| -%>
      t.remove :<%= c.first %>
<%      end -%>
    end
<%    else -%>
    drop_table :<%= table -%>
<%    end -%>

<%  end -%>
  end

end