# This migration comes from spree (originally 20120831092320)
class SpreeOneTwo < ActiveRecord::Migration[4.2]
  def up
    # This migration is just a compressed version of all the previous
    # migrations for spree_core. Do not run it if one of the core tables
    # already exists. Assume the best.
    return if data_source_exists?(:spree_addresses)


    create_table :spree_activators do |t|
      t.string     :description
      t.datetime   :expires_at
      t.datetime   :starts_at
      t.string     :name
      t.string     :event_name
      t.string     :type
      t.integer    :usage_limit
      t.string     :match_policy, default: 'all'
      t.string     :code
      t.boolean    :advertise,    default: false
      t.string     :path
      t.timestamps null: false, precision: 6
    end

    create_table :spree_addresses do |t|
      t.string     :firstname
      t.string     :lastname
      t.string     :address1
      t.string     :address2
      t.string     :city
      t.string     :zipcode
      t.string     :phone
      t.string     :state_name
      t.string     :alternative_phone
      t.string     :company
      t.references :state
      t.references :country
      t.timestamps null: false, precision: 6
    end

    add_index :spree_addresses, [:firstname], name: 'index_addresses_on_firstname'
    add_index :spree_addresses, [:lastname],  name: 'index_addresses_on_lastname'

    create_table :spree_adjustments do |t|
      t.references :source,     polymorphic: true
      t.references :adjustable, polymorphic: true
      t.references :originator, polymorphic: true
      t.decimal    :amount,     precision: 8, scale: 2
      t.string     :label
      t.boolean    :mandatory
      t.boolean    :locked
      t.boolean    :eligible,   default: true
      t.timestamps null: false, precision: 6
    end

    add_index :spree_adjustments, [:adjustable_id], name: 'index_adjustments_on_order_id'

    create_table :spree_assets do |t|
      t.references :viewable,               polymorphic: true
      t.integer    :attachment_width
      t.integer    :attachment_height
      t.integer    :attachment_file_size
      t.integer    :position
      t.string     :attachment_content_type
      t.string     :attachment_file_name
      t.string     :type,                   limit: 75
      t.datetime   :attachment_updated_at
      t.text       :alt
    end

    add_index :spree_assets, [:viewable_id],          name: 'index_assets_on_viewable_id'
    add_index :spree_assets, [:viewable_type, :type], name: 'index_assets_on_viewable_type_and_type'

    create_table :spree_calculators do |t|
      t.string     :type
      t.references :calculable, polymorphic: true
      t.timestamps null: false, precision: 6
    end

    create_table :spree_configurations do |t|
      t.string     :name
      t.string     :type, limit: 50
      t.timestamps null: false, precision: 6
    end

    add_index :spree_configurations, [:name, :type], name: 'index_spree_configurations_on_name_and_type'

    create_table :spree_countries do |t|
      t.string  :iso_name
      t.string  :iso
      t.string  :iso3
      t.string  :name
      t.integer :numcode
    end

    create_table :spree_credit_cards do |t|
      t.string     :month
      t.string     :year
      t.string     :cc_type
      t.string     :last_digits
      t.string     :first_name
      t.string     :last_name
      t.string     :start_month
      t.string     :start_year
      t.string     :issue_number
      t.references :address
      t.string     :gateway_customer_profile_id
      t.string     :gateway_payment_profile_id
      t.timestamps null: false, precision: 6
    end

    create_table :spree_gateways do |t|
      t.string     :type
      t.string     :name
      t.text       :description
      t.boolean    :active,      default: true
      t.string     :environment, default: 'development'
      t.string     :server,      default: 'test'
      t.boolean    :test_mode,   default: true
      t.timestamps null: false, precision: 6
    end

    create_table :spree_inventory_units do |t|
      t.integer    :lock_version,        default: 0
      t.string     :state
      t.references :variant
      t.references :order
      t.references :shipment
      t.references :return_authorization
      t.timestamps null: false, precision: 6
    end

    add_index :spree_inventory_units, [:order_id],    name: 'index_inventory_units_on_order_id'
    add_index :spree_inventory_units, [:shipment_id], name: 'index_inventory_units_on_shipment_id'
    add_index :spree_inventory_units, [:variant_id],  name: 'index_inventory_units_on_variant_id'

    create_table :spree_line_items do |t|
      t.references :variant
      t.references :order
      t.integer    :quantity,                               null: false
      t.decimal    :price,    precision: 8, scale: 2, null: false
      t.timestamps null: false, precision: 6
    end

    add_index :spree_line_items, [:order_id],   name: 'index_spree_line_items_on_order_id'
    add_index :spree_line_items, [:variant_id], name: 'index_spree_line_items_on_variant_id'

    create_table :spree_log_entries do |t|
      t.references :source, polymorphic: true
      t.text     :details
      t.timestamps null: false, precision: 6
    end

    create_table :spree_mail_methods do |t|
      t.string     :environment
      t.boolean    :active,     default: true
      t.timestamps null: false, precision: 6
    end

    create_table :spree_option_types do |t|
      t.string    :name,         limit: 100
      t.string    :presentation, limit: 100
      t.integer   :position,                   default: 0, null: false
      t.timestamps null: false, precision: 6
    end

    create_table :spree_option_types_prototypes, id: false do |t|
      t.references :prototype
      t.references :option_type
    end

    create_table :spree_option_values do |t|
      t.integer    :position
      t.string     :name
      t.string     :presentation
      t.references :option_type
      t.timestamps null: false, precision: 6
    end

    create_table :spree_option_values_variants, id: false do |t|
      t.references :variant
      t.references :option_value
    end

    add_index :spree_option_values_variants, [:variant_id, :option_value_id], name: 'index_option_values_variants_on_variant_id_and_option_value_id'
    add_index :spree_option_values_variants, [:variant_id],                   name: 'index_spree_option_values_variants_on_variant_id'

    create_table :spree_orders do |t|
      t.string     :number,               limit: 15
      t.decimal    :item_total,                         precision: 8, scale: 2, default: 0.0, null: false
      t.decimal    :total,                              precision: 8, scale: 2, default: 0.0, null: false
      t.string     :state
      t.decimal    :adjustment_total,                   precision: 8, scale: 2, default: 0.0, null: false
      t.references :user
      t.datetime   :completed_at
      t.references :bill_address
      t.references :ship_address
      t.decimal    :payment_total,                      precision: 8, scale: 2, default: 0.0
      t.references :shipping_method
      t.string     :shipment_state
      t.string     :payment_state
      t.string     :email
      t.text       :special_instructions
      t.timestamps null: false, precision: 6
    end

    add_index :spree_orders, [:number], name: 'index_spree_orders_on_number'

    create_table :spree_payment_methods do |t|
      t.string     :type
      t.string     :name
      t.text       :description
      t.boolean    :active,      default: true
      t.string     :environment, default: 'development'
      t.datetime   :deleted_at
      t.string     :display_on
      t.timestamps null: false, precision: 6
    end

    create_table :spree_payments do |t|
      t.decimal    :amount, precision: 8, scale: 2, default: 0.0, null: false
      t.references :order
      t.references :source, polymorphic: true
      t.references :payment_method
      t.string     :state
      t.string     :response_code
      t.string     :avs_response
      t.timestamps null: false, precision: 6
    end

    create_table :spree_preferences do |t|
      t.string     :name, limit: 100
      t.references :owner, polymorphic: true
      t.text       :value
      t.string     :key
      t.string     :value_type
      t.timestamps null: false, precision: 6
    end

    add_index :spree_preferences, [:key], name: 'index_spree_preferences_on_key', unique: true

    create_table :spree_product_option_types do |t|
      t.integer    :position
      t.references :product
      t.references :option_type
      t.timestamps null: false, precision: 6
    end

    create_table :spree_product_properties do |t|
      t.string     :value
      t.references :product
      t.references :property
      t.timestamps null: false, precision: 6
    end

    add_index :spree_product_properties, [:product_id], name: 'index_product_properties_on_product_id'

    create_table :spree_products do |t|
      t.string     :name,                 default: '', null: false
      t.text       :description
      t.datetime   :available_on
      t.datetime   :deleted_at
      t.string     :permalink
      t.string     :meta_description
      t.string     :meta_keywords
      t.references :tax_category
      t.references :shipping_category
      t.integer    :count_on_hand,        default: 0,  null: false
      t.timestamps null: false, precision: 6
    end

    add_index :spree_products, [:available_on], name: 'index_spree_products_on_available_on'
    add_index :spree_products, [:deleted_at],   name: 'index_spree_products_on_deleted_at'
    add_index :spree_products, [:name],         name: 'index_spree_products_on_name'
    add_index :spree_products, [:permalink],    name: 'index_spree_products_on_permalink'

    create_table :spree_products_taxons, id: false do |t|
      t.references :product
      t.references :taxon
    end

    add_index :spree_products_taxons, [:product_id], name: 'index_spree_products_taxons_on_product_id'
    add_index :spree_products_taxons, [:taxon_id],   name: 'index_spree_products_taxons_on_taxon_id'

    create_table :spree_properties do |t|
      t.string     :name
      t.string     :presentation, null: false
      t.timestamps null: false, precision: 6
    end

    create_table :spree_properties_prototypes, id: false do |t|
      t.references :prototype
      t.references :property
    end

    create_table :spree_prototypes do |t|
      t.string     :name
      t.timestamps null: false, precision: 6
    end

    create_table :spree_return_authorizations do |t|
      t.string     :number
      t.string     :state
      t.decimal    :amount, precision: 8, scale: 2, default: 0.0, null: false
      t.references :order
      t.text       :reason
      t.timestamps null: false, precision: 6
    end

    create_table :spree_roles do |t|
      t.string :name
    end

    create_table :spree_roles_users, id: false do |t|
      t.references :role
      t.references :user
    end

    add_index :spree_roles_users, [:role_id], name: 'index_spree_roles_users_on_role_id'
    add_index :spree_roles_users, [:user_id], name: 'index_spree_roles_users_on_user_id'

    create_table :spree_shipments do |t|
      t.string     :tracking
      t.string     :number
      t.decimal    :cost,           precision: 8, scale: 2
      t.datetime   :shipped_at
      t.references :order
      t.references :shipping_method
      t.references :address
      t.string     :state
      t.timestamps null: false, precision: 6
    end

    add_index :spree_shipments, [:number], name: 'index_shipments_on_number'

    create_table :spree_shipping_categories do |t|
      t.string   :name
      t.timestamps null: false, precision: 6
    end

    create_table :spree_shipping_methods do |t|
      t.string     :name
      t.references :zone
      t.string     :display_on
      t.references :shipping_category
      t.boolean    :match_none
      t.boolean    :match_all
      t.boolean    :match_one
      t.datetime   :deleted_at
      t.timestamps null: false, precision: 6
    end

    create_table :spree_state_changes do |t|
      t.string     :name
      t.string     :previous_state
      t.references :stateful
      t.references :user
      t.string     :stateful_type
      t.string     :next_state
      t.timestamps null: false, precision: 6
    end

    create_table :spree_states do |t|
      t.string     :name
      t.string     :abbr
      t.references :country
    end

    create_table :spree_tax_categories do |t|
      t.string     :name
      t.string     :description
      t.boolean    :is_default, default: false
      t.datetime   :deleted_at
      t.timestamps null: false, precision: 6
    end

    create_table :spree_tax_rates do |t|
      t.decimal    :amount,            precision: 8, scale: 5
      t.references :zone
      t.references :tax_category
      t.boolean    :included_in_price, default: false
      t.timestamps null: false, precision: 6
    end

    create_table :spree_taxonomies do |t|
      t.string     :name, null: false
      t.timestamps null: false, precision: 6
    end

    create_table :spree_taxons do |t|
      t.references :parent
      t.integer    :position,          default: 0
      t.string     :name,                             null: false
      t.string     :permalink
      t.references :taxonomy
      t.integer    :lft
      t.integer    :rgt
      t.string     :icon_file_name
      t.string     :icon_content_type
      t.integer    :icon_file_size
      t.datetime   :icon_updated_at
      t.text       :description
      t.timestamps null: false, precision: 6
    end

    add_index :spree_taxons, [:parent_id],   name: 'index_taxons_on_parent_id'
    add_index :spree_taxons, [:permalink],   name: 'index_taxons_on_permalink'
    add_index :spree_taxons, [:taxonomy_id], name: 'index_taxons_on_taxonomy_id'

    create_table :spree_tokenized_permissions, force: true do |t|
      t.references :permissable, polymorphic: true
      t.string     :token
      t.timestamps null: false, precision: 6
    end

    add_index :spree_tokenized_permissions, [:permissable_id, :permissable_type], name: 'index_tokenized_name_and_type'

    create_table :spree_trackers do |t|
      t.string     :environment
      t.string     :analytics_id
      t.boolean    :active,       default: true
      t.timestamps null: false, precision: 6
    end

    create_table :spree_users do |t|
      t.string     :encrypted_password,     limit: 128
      t.string     :password_salt,          limit: 128
      t.string     :email
      t.string     :remember_token
      t.string     :persistence_token
      t.string     :reset_password_token
      t.string     :perishable_token
      t.integer    :sign_in_count,                         default: 0, null: false
      t.integer    :failed_attempts,                       default: 0, null: false
      t.datetime   :last_request_at
      t.datetime   :current_sign_in_at
      t.datetime   :last_sign_in_at
      t.string     :current_sign_in_ip
      t.string     :last_sign_in_ip
      t.string     :login
      t.references :ship_address
      t.references :bill_address
      t.string     :authentication_token
      t.string     :unlock_token
      t.datetime   :locked_at
      t.datetime   :remember_created_at
      t.datetime   :reset_password_sent_at
      t.timestamps null: false, precision: 6
    end

    create_table :spree_variants do |t|
      t.string     :sku,                                         default: '',    null: false
      t.decimal    :price,         precision: 8, scale: 2,                    null: false
      t.decimal    :weight,        precision: 8, scale: 2
      t.decimal    :height,        precision: 8, scale: 2
      t.decimal    :width,         precision: 8, scale: 2
      t.decimal    :depth,         precision: 8, scale: 2
      t.datetime   :deleted_at
      t.boolean    :is_master,                                   default: false
      t.references :product
      t.integer    :count_on_hand,                               default: 0,     null: false
      t.decimal    :cost_price,    precision: 8, scale: 2
      t.integer    :position
    end

    add_index :spree_variants, [:product_id], name: 'index_spree_variants_on_product_id'

    create_table :spree_zone_members do |t|
      t.references :zoneable, polymorphic: true
      t.references :zone
      t.timestamps null: false, precision: 6
    end

    create_table :spree_zones do |t|
      t.string     :name
      t.string     :description
      t.boolean    :default_tax,        default: false
      t.integer    :zone_members_count, default: 0
      t.timestamps null: false, precision: 6
    end
  end
end
