class Caboose::Schema < Caboose::Utilities::Schema

  # Tables (in order) that were renamed in the development of the gem.
  def self.renamed_tables
    {
      :roles_users             => :role_memberships,
      :permissions_roles       => :role_permissions,
      #:page_block_field_values => :fields,
      #:page_block_fields       => :field_types,
      :page_block_types        => :block_types,
      :page_blocks             => :blocks
    }
  end

  def self.renamed_columns
    {
      #Caboose::Field     => { :page_block_id        => :block_id,
      #                        :page_block_field_id  => :field_type_id },
      #Caboose::FieldType => { :page_block_type_id   => :block_type_id },
      Caboose::Block     => { :page_block_type_id   => :block_type_id }
    }
  end

  def self.removed_columns
    {
      Caboose::Block => [:block_type],
      #Caboose::FieldType => [:model_binder_options],
      Caboose::AbValue => [:i, :text],
      Caboose::AbOption => [:text],      
      #Caboose::Field => [:child_block_id],
      Caboose::BlockType => [:layout_function],
      Caboose::CalendarEvent => [
        :repeat_period , 
        :repeat_sun    , 
        :repeat_mon    , 
        :repeat_tue    , 
        :repeat_wed    , 
        :repeat_thu    , 
        :repeat_fri    , 
        :repeat_sat    , 
        :repeat_start  , 
        :repeat_end    
      ],
      Caboose::CalendarEventGroup => [
        :repeat_period , 
        :repeat_sun    , 
        :repeat_mon    , 
        :repeat_tue    , 
        :repeat_wed    , 
        :repeat_thu    , 
        :repeat_fri    , 
        :repeat_sat    , 
        :repeat_start  , 
        :repeat_end        
      ],
      Caboose::Order => [
        :shipping_method       , 
        :shipping_method_code  ,
        :email                 ,
        :order_number          ,
        :payment_id            ,
        :gateway_id            ,
        :date_authorized       ,
        :date_captured         ,
        :date_cancelled        ,                
        :shipping_carrier      ,
        :shipping_service_code ,
        :shipping_service_name ,        
        :transaction_id        ,
        :transaction_id        ,
        :transaction_service   ,
        :amount_discounted     ,
        :auth_code             ,                
        :date_shipped          ,                        
        :decremented           
      ],        
      #Caboose::PageCache => [:block],
      Caboose::ShippingPackage => [:price, :carrier, :service_code, :service_name, :shipping_method_id, :length, :width, :height],
      Caboose::Site => [:shipping_cost_function],
      Caboose::StoreConfig => [:use_usps, :allowed_shipping_codes, :default_shipping_code, :pp_relay_url, :pp_response_url],
      Caboose::Variant => [:quantity],
      Caboose::Vendor => [:vendor, :vendor_id]
    }
  end

  # Any column indexes that need to exist in the database
  def self.indexes
    {
      Caboose::Block                  => [:parent_id],
      Caboose::BlockType              => [:parent_id],
      Caboose::RoleMembership         => [ :role_id    , :user_id          ],
      Caboose::RolePermission         => [ :role_id    , :permission_id    ],
      Caboose::PostCategoryMembership => [ :post_id    , :post_category_id ]
      #Caboose::Session                => [ :session_id , :updated_at       ]
    }
  end

  # The schema of the database
  # { Model => [[name, data_type, options]] }
  def self.schema
    {
      Caboose::AbVariant => [
        [ :name           , :string ],
        [ :analytics_name , :string ],
      ],
      Caboose::AbOption => [
        [ :ab_variant_id , :integer ],
        [ :value         , :string  ]
      ],
      Caboose::AbValue => [
        [ :session_id    , :string  ],
        [ :ab_variant_id , :integer ],
        [ :ab_option_id  , :integer ]
      ],
      Caboose::Address => [
        [ :name          , :string  ],
        [ :first_name    , :string  ],
        [ :last_name     , :string  ],
        [ :street        , :string  ],
        [ :address1      , :string  ],
        [ :address2      , :string  ],
        [ :company       , :string  ],
        [ :city          , :string  ],
        [ :state         , :string  ],
        [ :province      , :string  ],
        [ :province_code , :string  ],
        [ :zip           , :string  ],
        [ :country       , :string  ],
        [ :country_code  , :string  ],
        [ :phone         , :string  ]
      ],
      Caboose::Asset => [
        [ :page_id        , :integer    ],
        [ :user_id        , :integer    ],
        [ :date_uploaded  , :datetime   ],
        [ :name           , :string     ],
        [ :filename       , :string     ],
        [ :description    , :string     ],
        [ :extension      , :string     ]
      ],
      Caboose::Block => [
        [ :page_id               , :integer ],
        [ :parent_id             , :integer ],
        [ :block_type_id         , :integer ],
        [ :sort_order            , :integer , { :default => 0 }],
        [ :name                  , :string  ],
        [ :value                 , :text    ],
        [ :file                  , :attachment ],
        [ :image                 , :attachment ]
      ],
      Caboose::BlockType => [        
        [ :parent_id                       , :integer ],
        [ :name                            , :string  ],
        [ :description                     , :string  ],
        [ :icon                            , :string  ],
        [ :is_global                       , :boolean , { :default => false }],
        [ :block_type_category_id          , :integer , { :default => 2 }],
        [ :render_function                 , :text    ],
        [ :use_render_function             , :boolean , { :default => false }],
        [ :use_render_function_for_layout  , :boolean , { :default => false }],
        [ :allow_child_blocks              , :boolean , { :default => false }],
        [ :default_child_block_type_id     , :integer ],
        [ :field_type                      , :string  ],
        [ :default                         , :text    ],
        [ :width                           , :integer ],
        [ :height                          , :integer ],
        [ :fixed_placeholder               , :boolean ],
        [ :options                         , :text    ],
        [ :options_function                , :text    ],
        [ :options_url                     , :string  ],
        [ :share                           , :boolean , { :default => true  }],
        [ :downloaded                      , :boolean , { :default => false }]
      ],
      Caboose::BlockTypeSiteMembership => [
        [ :site_id        , :integer ],
        [ :block_type_id  , :integer ]
      ],      
      Caboose::BlockTypeCategory => [
        [ :parent_id  , :integer ],
        [ :name       , :string  ]
      ],
      Caboose::BlockTypeSource => [
        [ :name       , :string ],
        [ :url        , :string ],
        [ :token      , :string ],
        [ :priority   , :integer, { :default => 0 }],
        [ :active     , :boolean, { :default => true }],
      ],
      Caboose::BlockTypeSummary => [
        [ :block_type_source_id , :integer ],
        [ :name                 , :string  ],
        [ :description          , :string  ]
      ],
      Caboose::Calendar => [
        [ :site_id      , :integer  ],
        [ :name         , :string   ],
        [ :description  , :text     ]  
      ],
      Caboose::CalendarEvent => [
        [ :calendar_id              , :integer  ],
        [ :calendar_event_group_id  , :integer  ],
        [ :name                     , :string   ],
        [ :description              , :text     ],
        [ :location                 , :string   ],
        [ :begin_date               , :datetime ],
        [ :end_date                 , :datetime ],
        [ :all_day                  , :boolean  , { :default => false }],        
        [ :repeats                  , :boolean  , { :default => false }]
      ],
      Caboose::CalendarEventGroup => [
        [ :frequency    , :integer  , { :default => 1 }],
        [ :period       , :string   , { :default => 'Week' }],        
        [ :repeat_by    , :string   ],
        [ :sun          , :boolean  , { :default => false }],
        [ :mon          , :boolean  , { :default => false }],
        [ :tue          , :boolean  , { :default => false }],
        [ :wed          , :boolean  , { :default => false }],
        [ :thu          , :boolean  , { :default => false }],
        [ :fri          , :boolean  , { :default => false }],
        [ :sat          , :boolean  , { :default => false }],
        [ :date_start   , :date     ],
        [ :repeat_count , :integer  ],
        [ :date_end     , :date     ]
      ],
      Caboose::Category => [
        [ :site_id               , :integer   ],
        [ :parent_id             , :integer   ],
        [ :alternate_id          , :string    ],
        [ :name                  , :string    ],
        [ :url                   , :string    ],
        [ :slug                  , :string    ],
        [ :status                , :string    ],
        [ :image_file_name       , :string    ],
        [ :image_content_type    , :string    ],
        [ :image_file_size       , :integer   ],
        [ :image_updated_at      , :datetime  ],
        [ :square_offset_x       , :integer   ],
        [ :square_offset_y       , :integer   ],
        [ :square_scale_factor   , :numeric   ],
        [ :sort_order            , :integer   ]
      ],
      Caboose::CategoryMembership => [        
        [ :category_id           , :integer ],
        [ :product_id            , :integer ]      
      ],
      Caboose::CustomizationMembership => [
        [ :product_id       , :integer ],
        [ :customization_id , :integer ]
      ],
      Caboose::DatabaseSession => [
        [ :session_id  , :string   , :null => false ],
        [ :data        , :text                      ],
        [ :created_at  , :datetime , :null => true  ],
        [ :updated_at  , :datetime , :null => true  ]
      ],
      Caboose::Discount => [
        [ :gift_card_id , :integer  ],
        [ :order_id     , :integer  ],                
        [ :amount       , :decimal   , { :precision => 8, :scale => 2 }]        
      ],
      Caboose::Domain => [
        [ :site_id            , :integer ],
        [ :domain             , :string  ],
        [ :primary            , :boolean, { :default => false }],
        [ :under_construction , :boolean, { :default => false }]
      ],
      Caboose::GiftCard => [
        [ :site_id         , :integer  ],        
        [ :name            , :string   ],
        [ :code            , :string   ],
        [ :card_type       , :string   ],
        [ :total           , :decimal   , { :precision => 8, :scale => 2 }],
        [ :balance         , :decimal   , { :precision => 8, :scale => 2 }],
        [ :min_order_total , :decimal   , { :precision => 8, :scale => 2 }],        
        [ :date_available  , :datetime ],
        [ :date_expires    , :datetime ],
        [ :status          , :string   ]                                
      ],      
      Caboose::LineItem => [
        [ :order_id              , :integer  ],
        [ :order_package_id      , :integer  ],
        [ :variant_id            , :integer  ],
        [ :parent_id             , :integer  ],
        [ :quantity              , :integer   , :default => 0 ],
        [ :status                , :string   ],
        [ :tracking_number       , :string   ],        
        [ :price                 , :decimal   , { :precision => 8, :scale => 2 }],
        [ :notes                 , :text     ],
        [ :custom1               , :string   ],
        [ :custom2               , :string   ],
        [ :custom3               , :string   ]
      ],
      Caboose::MediaCategory => [
        [ :parent_id         , :integer ],
        [ :site_id           , :integer ],
        [ :name              , :string  ]        
      ],
      Caboose::MediaImage => [
        [ :media_category_id , :integer    ],
        [ :name              , :string     ],
        [ :description       , :text       ],
        [ :image             , :attachment ]
      ],
      Caboose::MediaFile => [
        [ :media_category_id , :integer    ],
        [ :name              , :string     ],
        [ :description       , :text       ],
        [ :file              , :attachment ]
      ],
      Caboose::OrderTransaction => [
        [ :order_id              , :integer  ],
        [ :date_processed        , :datetime ],
        [ :transaction_type      , :string   ],
        [ :amount                , :decimal   , { :precision => 8, :scale => 2 }],        
        [ :transaction_id        , :string   ],
        [ :auth_code             , :string   ],
        [ :response_code         , :string   ],
        [ :success               , :boolean  ]        
      ],
      Caboose::OrderDiscount => [
        [ :order_id              , :integer ],
        [ :discount_id           , :integer ]
      ],
      Caboose::OrderPackage => [
        [ :order_id             , :integer ],
        [ :shipping_method_id   , :integer ],
        [ :shipping_package_id  , :integer ],
        [ :status               , :string  ],
        [ :tracking_number      , :string  ],
        [ :total                , :decimal  , { :precision => 8, :scale => 2 }]
      ],
      Caboose::Order => [
        [ :site_id               , :integer  ],
        [ :alternate_id          , :integer  ],        
        [ :subtotal              , :decimal  , { :precision => 8, :scale => 2 }],
        [ :tax                   , :decimal  , { :precision => 8, :scale => 2 }],
        [ :shipping              , :decimal  , { :precision => 8, :scale => 2 }],
        [ :handling              , :decimal  , { :precision => 8, :scale => 2 }],
        [ :custom_discount       , :decimal  , { :precision => 8, :scale => 2 }],
        [ :discount              , :decimal  , { :precision => 8, :scale => 2 }],
        [ :total                 , :decimal  , { :precision => 8, :scale => 2 }],
        [ :customer_id           , :integer  ],
        [ :financial_status      , :string   ],
        [ :shipping_address_id   , :integer  ],
        [ :billing_address_id    , :integer  ],
        [ :notes                 , :text     ],
        [ :status                , :string   ],
        [ :date_created          , :datetime ],
        [ :referring_site        , :text     ],
        [ :landing_page          , :string   ],
        [ :landing_page_ref      , :string   ],
        [ :auth_amount           , :decimal  , { :precision => 8, :scale => 2 }]
        
        #[ :email                 , :string   ],
        #[ :order_number          , :string   ],
        #[ :payment_id            , :integer  ],
        #[ :gateway_id            , :integer  ],
        #[ :date_authorized       , :datetime ],
        #[ :date_captured         , :datetime ],
        #[ :date_cancelled        , :datetime ],                
        #[ :shipping_carrier      , :string   ],
        #[ :shipping_service_code , :string   ],
        #[ :shipping_service_name , :string   ],        
        #[ :transaction_id        , :string   ],
        #[ :transaction_id        , :string   ],
        #[ :transaction_service   , :string   ],
        #[ :amount_discounted     , :numeric  ],
        #[ :auth_code             , :string   ],                
        #[ :date_shipped          , :datetime ],                        
        #[ :decremented           , :boolean  ]
      ],      
      Caboose::Page => [
        [ :site_id               , :integer ],
        [ :parent_id             , :integer ],
        [ :title                 , :string  ],
        [ :menu_title            , :string  ],
        [ :slug                  , :string  ],
        [ :alias                 , :string  ],
        [ :uri                   , :string  ],
        [ :redirect_url          , :string  ],
        [ :hide                  , :boolean , { :default => false }],
        [ :content_format        , :integer , { :default => Caboose::Page::CONTENT_FORMAT_HTML }],
        [ :custom_css            , :text    ],
        [ :custom_js             , :text    ],
        [ :linked_resources      , :text    ],
        [ :layout                , :string  ],
        [ :sort_order            , :integer , { :default => 0                }],
        [ :custom_sort_children  , :boolean , { :default => false            }],
        [ :seo_title             , :string  , { :limit => 70                 }],
        [ :meta_keywords         , :text    ], 
        [ :meta_description      , :string  , { :limit => 156                }],
        [ :meta_robots           , :string  , { :default => 'index, follow'  }],
        [ :canonical_url         , :string  ],
        [ :fb_description        , :string  , { :limit => 156 }],
        [ :gp_description        , :string  , { :limit => 156 }]
      ],
      Caboose::PageCache => [
        [ :page_id               , :integer ],
        [ :render_function       , :text    ],
        [ :block                 , :binary  ],
        [ :refresh               , :boolean , { :default => false }]        
      ],
      Caboose::PagePermission => [
        [ :role_id , :integer  ],
        [ :page_id , :integer  ],
        [ :action  , :string   ]
      ],
      Caboose::PageTag => [        
        [ :page_id , :integer  ],
        [ :tag     , :string   ]
      ],
      Caboose::PermanentRedirect => [
        [ :site_id  , :integer ],
        [ :priority , :integer , { :default => 0 }],
        [ :is_regex , :boolean , { :default => false }],
        [ :old_url  , :string  ],
        [ :new_url  , :string  ]
      ],
      Caboose::Permission => [
        [ :resource , :string ],
        [ :action   , :string ]
      ],
      Caboose::Post => [
        [ :site_id              , :integer    ],
        [ :title                , :text       ],
        [ :body                 , :text 		  ],
        [ :hide                 , :boolean    ],
        [ :image_url            , :text 		  ],
        [ :published            , :boolean    ],
        [ :created_at           , :datetime   ],
        [ :updated_at           , :datetime   ],
        [ :image                , :attachment ]
      ],
      Caboose::PostCategory => [
        [ :site_id  , :integer ],
        [ :name     , :string  ]
      ],
      Caboose::PostCategoryMembership => [
        [ :post_id          , :integer ],
        [ :post_category_id , :integer ]
      ],
      Caboose::Product => [
        [ :site_id               , :integer   ],
        [ :alternate_id          , :string    ],
        [ :title                 , :string    ],
        [ :caption               , :string    ],
        [ :description           , :text      ],
        [ :handle                , :string    ],
        [ :vendor_id             , :integer   ],
        [ :option1               , :string    ],
        [ :option2               , :string    ],
        [ :option3               , :string    ],
        [ :category_id           , :integer   ],
        [ :status                , :string    ],
        [ :default1              , :string    ],
        [ :default2              , :string    ],
        [ :default3              , :string    ],
        [ :seo_title             , :string    ],
        [ :seo_description       , :string    ],
        [ :alternate_id          , :string    ],
        [ :date_available        , :datetime  ],
        [ :custom_input          , :text      ],
        [ :sort_order            , :integer   ],
        [ :featured              , :boolean   , :default => false ],
        [ :stackable_group_id    , :integer   ]
      ],
      Caboose::ProductImage => [
        [ :product_id            , :integer  ],
        [ :alternate_id          , :string   ],
        [ :title                 , :string   ],
        [ :position              , :integer  ],
        [ :image_file_name       , :string   ],
        [ :image_content_type    , :string   ],
        [ :image_file_size       , :integer  ],
        [ :image_updated_at      , :datetime ],
        [ :square_offset_x       , :integer  ],
        [ :square_offset_y       , :integer  ],
        [ :square_scale_factor   , :numeric  ]
      ],
      Caboose::ProductImageVariant => [
        [ :product_image_id      , :integer ],
        [ :variant_id            , :integer ]
      ],
      Caboose::Review => [
        [ :product_id            , :integer   ],
        [ :content               , :string    ],
        [ :name                  , :string    ],
        [ :rating                , :decimal   ] 
      ],
      Caboose::Role => [
        [ :parent_id            , :integer  ],
        [ :name                 , :string   ],
        [ :description          , :string   ]
      ],
      Caboose::RoleMembership => [
        [ :role_id, :integer ],
        [ :user_id, :integer ]
      ],
      Caboose::RolePermission => [
	    	[ :role_id        , :integer ],
	    	[ :permission_id  , :integer ]
	    ],
	    Caboose::SearchFilter => [
        [ :url                   , :string   ],
        [ :title_like            , :string   ],
        [ :search_like           , :string   ],
        [ :category_id           , :integer  ],
        [ :category              , :text     ],
        [ :vendors               , :text     ],
        [ :option1               , :text     ],
        [ :option2               , :text     ],
        [ :option3               , :text     ],        
        [ :prices                , :text     ] 
      ],
      Caboose::Setting => [
        [ :site_id  , :integer ],
        [ :name     , :string  ],
        [ :value    , :text    ]
      ],
      Caboose::ShippingMethod => [        
        [ :carrier          , :string  ],
        [ :service_code     , :string  ],
        [ :service_name     , :string  ]        
      ],      
      Caboose::ShippingPackage => [
        [ :site_id            , :integer ],
        [ :name               , :string  ],
        [ :inside_length      , :decimal ],
        [ :inside_width       , :decimal ],
        [ :inside_height      , :decimal ],
        [ :outside_length     , :decimal ],
        [ :outside_width      , :decimal ],
        [ :outside_height     , :decimal ],        
        [ :volume             , :decimal ],
        [ :empty_weight       , :decimal ],
        [ :cylinder           , :boolean , { :default => false }],
        [ :priority           , :integer , { :default => 1 }],
        [ :flat_rate_price    , :decimal ]
      ],
      Caboose::ShippingPackageMethod => [
        [ :shipping_package_id  , :integer ],
        [ :shipping_method_id   , :integer ]
      ],
      Caboose::Site => [
        [ :name                    , :string ],
        [ :description             , :text   ],
        [ :under_construction_html , :text   ],
        [ :use_store               , :boolean , { :default => false }]
      ],
      Caboose::SiteMembership => [
        [ :site_id     , :integer ],
        [ :user_id     , :integer ],
        [ :role        , :string  ]
      ],
      Caboose::SmtpConfig => [
        [ :site_id              , :integer ],
        [ :address              , :string  , { :default => 'localhost' }],
        [ :port                 , :integer , { :default => 25 }],
        [ :domain               , :string ],
        [ :user_name            , :string ],
        [ :password             , :string ],
        [ :authentication       , :string ], # :plain, :login, :cram_md5.
        [ :enable_starttls_auto , :boolean , { :default => true }]
      ],
      Caboose::SocialConfig => [
        [ :site_id              , :integer ],
        [ :facebook_page_id     , :string ],
        [ :twitter_username     , :string ],
        [ :instagram_username   , :string ],
        [ :youtube_url          , :string ],
        [ :pinterest_url        , :string ],
        [ :vimeo_url            , :string ],
        [ :rss_url              , :string ],
        [ :google_plus_url      , :string ],
        [ :linkedin_url         , :string ]
      ],
      Caboose::StackableGroup => [       
        [ :name           , :string  ],
        [ :extra_length   , :decimal ],
        [ :extra_width    , :decimal ],
        [ :extra_height   , :decimal ],
        [ :max_length     , :decimal ],
        [ :max_width      , :decimal ],
        [ :max_height     , :decimal ]
      ],
      Caboose::StoreConfig => [
        [ :site_id                 , :integer ],     
        [ :pp_name                 , :string  ],
        [ :pp_username             , :string  ],
        [ :pp_password             , :string  ],
        [ :pp_testing              , :boolean , { :default => true }],        
        [ :pp_relay_domain         , :string  ],                
        [ :ups_username            , :string  ],
        [ :ups_password            , :string  ],
        [ :ups_key                 , :string  ],
        [ :ups_origin_account      , :string  ],
        [ :usps_username           , :string  ],
        [ :usps_secret_key         , :string  ],
        [ :usps_publishable_key    , :string  ],
        [ :fedex_username          , :string  ],
        [ :fedex_password          , :string  ],
        [ :fedex_key               , :string  ],
        [ :fedex_account           , :string  ],
        [ :origin_country          , :string  ],
        [ :origin_state            , :string  ],
        [ :origin_city             , :string  ],
        [ :origin_zip              , :string  ],
        [ :fulfillment_email       , :string  ],
        [ :shipping_email          , :string  ],
        [ :handling_percentage     , :string  ],
        [ :calculate_packages      , :boolean , { :default => true }],
        [ :order_packages_function , :text    ],
        [ :shipping_rates_function , :text    ],
        [ :length_unit             , :string  , { :default => 'in' }],
        [ :weight_unit             , :string  , { :default => 'oz' }]
      ],
      Caboose::User => [
        [ :site_id              , :integer    ],
        [ :first_name           , :string     ],
        [ :last_name            , :string     ],
        [ :username             , :string     ],
        [ :email                , :string     ],
        [ :address              , :string     ],
        [ :address2             , :string     ],
        [ :city                 , :string     ],
        [ :state                , :string     ],
        [ :zip                  , :string     ],
        [ :phone                , :string     ],
        [ :fax                  , :string     ],        
        [ :timezone             , :string     , { :default => 'Central Time (US & Canada)' }],        
        [ :password             , :string     ],
        [ :password_reset_id    , :string     ],
        [ :password_reset_sent  , :datetime   ],
        [ :token                , :string     ],
        [ :date_created         , :datetime   ],
        [ :image                , :attachment ],
        [ :is_guest             , :boolean    , { :default => false }],
        [ :customer_profile_id  , :string     ],
        [ :payment_profile_id   , :string     ]
      ],
      Caboose::Variant => [
        [ :product_id            , :integer  ],
        [ :alternate_id          , :string   ],
        [ :sku                   , :string   ],
        [ :barcode               , :string   ],
        [ :price                 , :decimal   , { :precision => 8, :scale => 2 }],
        [ :sale_price            , :decimal   , { :precision => 8, :scale => 2 }],
        [ :date_sale_starts      , :datetime ],
        [ :date_sale_end         , :datetime ],
        [ :available             , :boolean  ],
        [ :quantity_in_stock     , :integer   , :default => 0 ],        
        [ :ignore_quantity       , :boolean  ],
        [ :allow_backorder       , :boolean  ],
        [ :weight                , :decimal  ],
        [ :length                , :decimal  ],
        [ :width                 , :decimal  ],
        [ :height                , :decimal  ],
        [ :volume                , :decimal  ],
        [ :cylinder              , :boolean  ],
        [ :option1               , :string   ],
        [ :option2               , :string   ],
        [ :option3               , :string   ],
        [ :requires_shipping     , :boolean  ],
        [ :taxable               , :boolean  ],        
        [ :shipping_unit_value   , :numeric  ],        
        [ :status                , :string   ],
        [ :option1_sort_order    , :integer  , { :default => 0 }],
        [ :option2_sort_order    , :integer  , { :default => 0 }],
        [ :option3_sort_order    , :integer  , { :default => 0 }],
        [ :sort_order            , :integer  , { :default => 0 }]
      ],
      Caboose::Vendor => [
        [ :site_id      , :integer    ],
        [ :alternate_id , :string     ],
        [ :name         , :string     ],
        [ :status       , :string     , { :default => 'Active' }],
        [ :featured     , :boolean    , { :default => false    }],
        [ :image        , :attachment ]
      ]
    }

  end

  # Loads initial data into the database
  def self.load_data

    c = ActiveRecord::Base.connection
    #if c.column_exists?(:pages, :content)
    #  Caboose::Page.reorder(:id).all.each do |p|
    #    Caboose::PageBlock.create( :page_id => p.id, :block_type => 'richtext', :value => p.content )
    #  end
    #  c.remove_column(:pages, :content)
    #end

    admin_user = nil
    if !Caboose::User.exists?(:username => 'admin')
      admin_user = Caboose::User.create(:first_name => 'Admin', :last_name => 'User', :username => 'admin', :email => 'william@nine.is')
      admin_user.password = Digest::SHA1.hexdigest(Caboose::salt + 'caboose')
      admin_user.save
    end
    admin_user = Caboose::User.where(:username => 'admin').first if admin_user.nil?

    if !Caboose::User.where(:id => Caboose::User::LOGGED_OUT_USER_ID).exists?
      Caboose::User.create(:id => Caboose::User::LOGGED_OUT_USER_ID, :first_name => 'Logged', :last_name => 'Out', :username => 'elo', :email => 'elo@nine.is')
    end

    Caboose::Role.create(:parent_id => -1           , :name => 'Admin'               ) if !Caboose::Role.exists?(:name =>  'Admin'               )
    admin_role  = Caboose::Role.where(:name => 'Admin'               ).first
    Caboose::Role.create(:parent_id => -1           , :name => 'Everyone Logged Out' ) if !Caboose::Role.exists?(:name =>  'Everyone Logged Out' )
    elo_role    = Caboose::Role.where(:name => 'Everyone Logged Out' ).first
    Caboose::Role.create(:parent_id => elo_role.id  , :name => 'Everyone Logged In'  ) if !Caboose::Role.exists?(:name =>  'Everyone Logged In'  )
    eli_role    = Caboose::Role.where(:name => 'Everyone Logged In'  ).first

    Caboose::User.create(:first_name => 'John', :last_name => 'Doe', :username => 'elo', :email => 'william@nine.is') if !Caboose::User.exists?(:username => 'elo')
    elo_user = Caboose::User.where(:username => 'elo').first

    Caboose::Permission.create(:resource => 'all'         , :action => 'all'    ) if !Caboose::Permission.exists?(:resource => 'all'	       , :action => 'all'    )
    Caboose::Permission.create(:resource => 'users'	      , :action => 'view'   ) if !Caboose::Permission.exists?(:resource => 'users'	     , :action => 'view'   )
    Caboose::Permission.create(:resource => 'users'	      , :action => 'edit'   ) if !Caboose::Permission.exists?(:resource => 'users'	     , :action => 'edit'   )
    Caboose::Permission.create(:resource => 'users'	      , :action => 'delete' ) if !Caboose::Permission.exists?(:resource => 'users'	     , :action => 'delete' )
    Caboose::Permission.create(:resource => 'users'	      , :action => 'add'    ) if !Caboose::Permission.exists?(:resource => 'users'	     , :action => 'add'    )
    Caboose::Permission.create(:resource => 'roles'	      , :action => 'view'   ) if !Caboose::Permission.exists?(:resource => 'roles'	     , :action => 'view'   )
    Caboose::Permission.create(:resource => 'roles'	      , :action => 'edit'   ) if !Caboose::Permission.exists?(:resource => 'roles'	     , :action => 'edit'   )
    Caboose::Permission.create(:resource => 'roles'	      , :action => 'delete' ) if !Caboose::Permission.exists?(:resource => 'roles'	     , :action => 'delete' )
    Caboose::Permission.create(:resource => 'roles'	      , :action => 'add'    ) if !Caboose::Permission.exists?(:resource => 'roles'	     , :action => 'add'    )
    Caboose::Permission.create(:resource => 'permissions' , :action => 'view'   ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'view'   )
    Caboose::Permission.create(:resource => 'permissions' , :action => 'edit'   ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'edit'   )
    Caboose::Permission.create(:resource => 'permissions' , :action => 'delete' ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'delete' )
    Caboose::Permission.create(:resource => 'permissions' , :action => 'add'    ) if !Caboose::Permission.exists?(:resource => 'permissions' , :action => 'add'    )

    # Add the admin user to the admin role
    Caboose::RoleMembership.create(:user_id => admin_user.id, :role_id => admin_role.id) if !Caboose::RoleMembership.exists?(:user_id => admin_user.id, :role_id => admin_role.id)

    # Add the elo to the elo role
    Caboose::RoleMembership.create(:user_id => elo_user.id, :role_id => elo_role.id) if !Caboose::RoleMembership.exists?(:user_id => elo_user.id, :role_id => elo_role.id)

    # Add the all/all permission to the admin role
    admin_perm = Caboose::Permission.where(:resource => 'all', :action => 'all').first
    Caboose::RolePermission.create(:role_id => admin_role.id, :permission_id => admin_perm.id) if !Caboose::RolePermission.exists?(:role_id => admin_role.id, :permission_id => admin_perm.id)

    # Create the necessary pages
    Caboose::Page.create(:title => 'Home'  , :parent_id => -1, :hide => 0, :layout => 'home', :uri => '') if !Caboose::Page.exists?(:title => 'Home')
    home_page = Caboose::Page.where(:title => 'Home', :parent_id => -1).first
    Caboose::Page.create(:title => 'Admin' , :parent_id => home_page.id, :hide => 0, :layout => 'admin', :alias => 'admin', :slug => 'admin', :uri => 'admin') if !Caboose::Page.exists?(:alias => 'admin')
    admin_page = Caboose::Page.where(:alias => 'admin').first
    Caboose::Page.create(:title => 'Login' , :parent_id => home_page.id, :hide => 0, :layout => 'login', :alias => 'login', :slug => 'login', :uri => 'login') if !Caboose::Page.exists?(:alias => 'login')
    login_page = Caboose::Page.where(:alias => 'login').first

    Caboose::PagePermission.create(:role_id => elo_role.id, :page_id => home_page.id  , :action => 'view') if !Caboose::PagePermission.exists?(:role_id => elo_role.id, :page_id => home_page.id  , :action => 'view')
    Caboose::PagePermission.create(:role_id => elo_role.id, :page_id => login_page.id , :action => 'view') if !Caboose::PagePermission.exists?(:role_id => elo_role.id, :page_id => login_page.id , :action => 'view')

    # Create a default post category
    Caboose::PostCategory.create(:name => 'General News') if !Caboose::PostCategory.exists?(:name => 'General News')

    # Create the required settings
    Caboose::Setting.create(:name => 'version'     , :value => Caboose::VERSION        ) if !Caboose::Setting.exists?(:name => 'version'     , :value => Caboose::VERSION        )
    Caboose::Setting.create(:name => 'site_name'   , :value => 'New Caboose Site'      ) if !Caboose::Setting.exists?(:name => 'site_name'   , :value => 'New Caboose Site'      )
    Caboose::Setting.create(:name => 'site_url'    , :value => 'www.mycaboosesite.com' ) if !Caboose::Setting.exists?(:name => 'site_url'    , :value => 'www.mycaboosesite.com' )
    Caboose::Setting.create(:name => 'admin_email' , :value => 'william@nine.is'       ) if !Caboose::Setting.exists?(:name => 'admin_email' , :value => 'william@nine.is'       )

    # Create default block type categories
    btc = Caboose::BlockTypeCategory
    layouts = btc.exists?(:name => 'Layouts') ? btc.where(:name => 'Layouts').first : btc.create(:name => 'Layouts')
    content = btc.exists?(:name => 'Content') ? btc.where(:name => 'Content').first : btc.create(:name => 'Content')
    btc.create(:name => 'Rows', :parent_id => content.id) if !btc.where(:name => 'Rows', :parent_id => content.id).exists?

    # Create default block types
    if !Caboose::BlockType.where(:name => 'layout_basic').exists?
      bt = Caboose::BlockType.create(:name => 'layout_basic', :description => 'Basic', :block_type_category_id => layouts.id, :use_render_function_for_layout => true, :allow_child_blocks => false, :field_type => 'block')
      Caboose::BlockType.create(:name => 'header'  , :description => 'Header'  , :parent_id => bt.id, :field_type => 'block')
      Caboose::BlockType.create(:name => 'content' , :description => 'Content' , :parent_id => bt.id, :field_type => 'block', :allow_child_blocks => true)
      Caboose::BlockType.create(:name => 'footer'  , :description => 'Footer'  , :parent_id => bt.id, :field_type => 'block')
    end

    if !Caboose::BlockType.where(:name => 'layout_left_sidebar').exists?
      bt = Caboose::BlockType.create(:name => 'layout_left_sidebar', :description => 'Left Sidebar', :block_type_category_id => layouts.id, :use_render_function_for_layout => true, :allow_child_blocks => false, :field_type => 'block')
      Caboose::BlockType.create(:name => 'header'  , :description => 'Header'  , :parent_id => bt.id, :field_type => 'block')
      Caboose::BlockType.create(:name => 'sidebar' , :description => 'Sidebar' , :parent_id => bt.id, :field_type => 'block', :allow_child_blocks => true)
      Caboose::BlockType.create(:name => 'content' , :description => 'Content' , :parent_id => bt.id, :field_type => 'block', :allow_child_blocks => true)
      Caboose::BlockType.create(:name => 'footer'  , :description => 'Footer'  , :parent_id => bt.id, :field_type => 'block')
    end

    if !Caboose::BlockType.where(:name => 'layout_right_sidebar').exists?
      bt = Caboose::BlockType.create(:name => 'layout_right_sidebar', :description => 'Right Sidebar', :block_type_category_id => layouts.id, :use_render_function_for_layout => true, :allow_child_blocks => false, :field_type => 'block')
      Caboose::BlockType.create(:name => 'header'  , :description => 'Header'  , :parent_id => bt.id, :field_type => 'block')
      Caboose::BlockType.create(:name => 'sidebar' , :description => 'Sidebar' , :parent_id => bt.id, :field_type => 'block', :allow_child_blocks => true)
      Caboose::BlockType.create(:name => 'content' , :description => 'Content' , :parent_id => bt.id, :field_type => 'block', :allow_child_blocks => true)
      Caboose::BlockType.create(:name => 'footer'  , :description => 'Footer'  , :parent_id => bt.id, :field_type => 'block')
    end

    if !Caboose::BlockType.where(:name => 'heading').exists?
      bt = Caboose::BlockType.create(:name => 'heading', :description => 'Heading', :field_type => 'block')
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'text', :description => 'Text', :field_type => 'text', :default => '', :width => 800, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'size', :description => 'Size', :field_type => 'text', :default =>  1, :width => 800, :fixed_placeholder => false, :options => "1|2|3|4|5|6")
    end

    if !Caboose::BlockType.where(:name => 'text').exists?
      Caboose::BlockType.create(:name => 'text', :description => 'Text', :field_type => 'text', :default => '', :width => 800, :height => 400, :fixed_placeholder => false)
    end
    if !Caboose::BlockType.where(:name => 'richtext').exists?
      Caboose::BlockType.create(:name => 'richtext', :description => 'Rich Text', :field_type => 'richtext', :default => '', :width => 800, :height => 400, :fixed_placeholder => false)
    else
      bt = Caboose::BlockType.where(:name => 'richtext').first
      bt.field_type = 'richtext'
      bt.save
    end
    if !Caboose::BlockType.where(:name => 'richtext2').exists?
      Caboose::BlockType.create(:name => 'richtext2', :description => 'Rich Text (Non-Parsed)', :field_type => 'richtext', :default => '', :width => 800, :height => 400, :fixed_placeholder => false)    
    end
    if !Caboose::BlockType.where(:name => 'image').exists?
      bt = Caboose::BlockType.create(:name => 'image', :description => 'Image', :field_type => 'block')
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'image_src'     , :description => 'Image'         , :field_type => 'image'  , :default => ''      , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'image_style'   , :description => 'Style'         , :field_type => 'select' , :default => 'Thumb' , :width => 400, :fixed_placeholder => false, :options => "Tiny\nThumb\nLarge")
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'link'          , :description => 'Link'          , :field_type => 'text'   , :default => ''      , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'width'         , :description => 'Width'         , :field_type => 'text'   , :default => ''      , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'height'        , :description => 'Height'        , :field_type => 'text'   , :default => ''      , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'margin_top'    , :description => 'Top Margin'    , :field_type => 'text'   , :default => '10'    , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'margin_right'  , :description => 'Right Margin'  , :field_type => 'text'   , :default => '10'    , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'margin_bottom' , :description => 'Bottom Margin' , :field_type => 'text'   , :default => '10'    , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'margin_left'   , :description => 'Left Margin'   , :field_type => 'text'   , :default => '10'    , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'align'         , :description => 'Align'         , :field_type => 'select' , :default => 'None'  , :width => 400, :fixed_placeholder => false, :options => "None\nCenter\nLeft\nRight")
    end
    if !Caboose::BlockType.where(:name => 'file').exists?
      bt = Caboose::BlockType.create(:name => 'file', :description => 'File', :field_type => 'block')
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'file' , :description => 'File' , :field_type => 'file', :default => ''         , :width => 400, :fixed_placeholder => false)
      Caboose::BlockType.create(:parent_id => bt.id, :name => 'text' , :description => 'Text' , :field_type => 'text', :default => 'Download' , :width => 400, :fixed_placeholder => false)
    end
    
    # Make sure a top-level media category for each site exists
    Caboose::Site.all.each do |site|
      cat = Caboose::MediaCategory.where("parent_id is null and site_id = ? and name = ?", site.id, 'Images').first
      Caboose::MediaCategory.create(:site_id => site.id, :name => 'Images') if cat.nil?
      cat = Caboose::MediaCategory.where("parent_id is null and site_id = ? and name = ?", site.id, 'Files').first
      Caboose::MediaCategory.create(:site_id => site.id, :name => 'Files') if cat.nil?
    end
    
    # Make sure a default category exists for all products
    if !Caboose::Category.exists?(1)
      Caboose::Category.create({
        :id   => 1,
        :name => 'All Products',
        :url  => '/products',
        :slug => 'products'
      })
    end
    
    if Caboose::ShippingMethod.all.count == 0
      Caboose::ShippingMethodLoader.load_shipping_methods
    end

  end
end