class OrderGroup < Group; end # Needed for renaming of OrderGroup to Ordergroup

class RoadToVersionThree < ActiveRecord::Migration[4.2]
  def self.up
    # TODO: Combine migrations since foodsoft3-development into one file
    # and try to build a migration path from old data.

    # == Message
    drop_table :messages
    create_table :messages do |t|
      t.references :sender
      t.text :recipients_ids
      t.string :subject, null: false
      t.text :body
      t.integer :email_state, default: 0, null: false
      t.boolean :private, default: false
      t.datetime :created_at
    end

    # Acts_as_paranoid
    add_column :suppliers, :deleted_at, :datetime
    add_column :articles, :deleted_at, :datetime
    add_column :groups, :deleted_at, :datetime

    # == Workgroups
    puts 'Migrate all groups to workgroups..'
    Group.find(:all, conditions: { type: '' }).each do |workgroup|
      workgroup.update_attribute(:type, 'Workgroup')
    end

    # == Ordergroups
    remove_column :groups, :actual_size # Useless, desposits are better stored within a transaction.note
    # rename from OrderGroup to Ordergroup
    rename_column :financial_transactions, :order_group_id, :ordergroup_id
    rename_column :group_orders, :order_group_id, :ordergroup_id
    rename_column :tasks, :group_id, :workgroup_id
    remove_index :group_orders, name: 'index_group_orders_on_order_group_id_and_order_id'
    add_index :group_orders, %i[ordergroup_id order_id], unique: true

    Group.find(:all, conditions: { type: 'OrderGroup' }).each do |ordergroup|
      ordergroup.update_attribute(:type, 'Ordergroup')
    end
    # move contact-infos from users to ordergroups
    add_column :groups, :contact_person, :string
    add_column :groups, :contact_phone, :string
    add_column :groups, :contact_address, :string
    Ordergroup.all.each do |ordergroup|
      contact = ordergroup.users.first
      if contact
        ordergroup.update(contact_person: contact.name, contact_phone: contact.phone,
                          contact_address: contact.address)
      end
    end
    remove_column :users, :address

    # == Order
    drop_table :orders
    drop_table :group_order_results
    drop_table :order_article_results
    drop_table :group_order_article_results
    GroupOrder.delete_all
    OrderArticle.delete_all
    GroupOrderArticle.delete_all
    GroupOrderArticleQuantity.delete_all

    create_table :orders do |t|
      t.references :supplier
      t.text :note
      t.datetime :starts
      t.datetime :ends
      t.string :state, default: 'open' # Statemachine ... open -> finished -> closed
      t.integer :lock_version, default: 0, null: false
      t.integer :updated_by_user_id
    end

    # == Invoice
    create_table :invoices do |t|
      t.references :supplier
      t.references :delivery
      t.references :order
      t.string :number
      t.date :date
      t.date :paid_on
      t.text :note
      t.decimal :amount, null: false, precision: 8, scale: 2, default: 0.0
      t.decimal :deposit, precision: 8, scale: 2, default: 0.0, null: false
      t.decimal :deposit_credit, precision: 8, scale: 2, default: 0.0, null: false
      t.timestamps
    end

    # == Delivery
    create_table :deliveries do |t|
      t.integer :supplier_id
      t.date :delivered_on
      t.datetime :created_at
    end

    # == Comment
    drop_table :comments
    create_table :order_comments do |t|
      t.references :order
      t.references :user
      t.text :text
      t.datetime :created_at
    end

    # == Article
    rename_column :articles, :net_price, :price
    remove_column :articles, :gross_price

    # == ArticlePrice
    create_table :article_prices do |t|
      t.references :article
      t.decimal :price, precision: 8, scale: 2, default: 0.0, null: false
      t.decimal :tax, precision: 8, scale: 2, default: 0.0, null: false
      t.decimal :deposit, precision: 8, scale: 2, default: 0.0, null: false
      t.integer :unit_quantity
      t.datetime :created_at
    end
    # Create price history for every Article
    Article.all.each do |a|
      a.article_prices.create price: a.price, tax: a.tax,
                              deposit: a.deposit, unit_quantity: a.unit_quantity
    end
    # Every Article has now a Category. Fix it if neccessary.
    Article.all(conditions: { article_category_id: nil }).each do |article|
      article.update_attribute(:article_category, ArticleCategory.first)
    end
    # order-articles
    add_column :order_articles, :article_price_id, :integer

    # == GroupOrder
    change_column :group_orders, :updated_by_user_id, :integer, default: nil, null: true

    # == GroupOrderArticle
    # The total order result in ordergroup is now saved!
    add_column :group_order_articles, :result, :integer, default: nil

    # == StockArticle
    add_column :articles, :type, :string
    add_column :articles, :quantity, :integer, default: 0

    # == StockChanges
    create_table :stock_changes do |t|
      t.references :delivery
      t.references :order
      t.references :stock_article
      t.integer :quantity, default: 0
      t.datetime :created_at
    end

    # == StockTaking
    create_table :stock_takings do |t|
      t.date :date
      t.text :note
      t.datetime :created_at
    end
    add_column :stock_changes, :stock_taking_id, :integer

    # == User
    # Ativate all Users for notification on upcoming tasks
    User.all.each { |u| u.settings['notify.upcoming_tasks'] = 1 }
  end

  def self.down; end
end
