use utf8;

package Interchange6::Schema::Result::Cart;

=head1 NAME

Interchange6::Schema::Result::Cart

=cut

use Interchange6::Schema::Candy -components =>
  [qw(InflateColumn::DateTime TimeStamp)];

=head1 DESCRIPTION

The Cart class (table) is used for storing shopping carts with products in the
cart held in the related L<Interchange6::Schema::Result::CartProduct> class.

=head1 ACCESSORS

=head2 carts_id

Primary key.

=cut

primary_column carts_id => {
    data_type         => "integer",
    is_auto_increment => 1,
};

=head2 name

The name of the cart. You might perhaps have a "main" cart that is used by
default for the current shopping session and also a "wishlist" cart. Other
uses might be "saved_items" so a user can save things for another time or
maybe on logout all cart items are moved to "previous_session" cart.

=cut

column name => {
    data_type     => "varchar",
    default_value => "",
    size          => 255,
};

=head2 users_id

Foreign key constraint on L<Interchange6::Schema::Result::User/users_id>
via L</user> relationship.

=cut

column users_id => {
    data_type      => "integer",
    is_nullable    => 1,
};

=head2 sessions_id

Foreign key constraint on L<Interchange6::Schema::Result::Session/sessions_id>
via L</session> relationship. Is nullable.

=cut

column sessions_id => {
    data_type      => "varchar",
    is_nullable    => 1,
    size           => 255,
};

=head2 created

Date and time when this record was created returned as L<DateTime> object.
Value is auto-set on insert.

=cut

column created => {
    data_type     => "datetime",
    set_on_create => 1,
};

=head2 last_modified

Date and time when this record was last modified returned as L<DateTime> object.
Value is auto-set on insert and update.

=cut

column last_modified => {
    data_type     => "datetime",
    set_on_create => 1,
    set_on_update => 1,
};

=head1 UNIQUE CONSTRAINTS

=head2 carts_name_sessions_id

On ( name, sessions_id )

=cut

unique_constraint carts_name_sessions_id => [qw/ name sessions_id /];

=head1 RELATIONS

=head2 cart_products

Type: has_many

Related object: L<Interchange6::Schema::Result::CartProduct>

=cut

has_many
  cart_products => "Interchange6::Schema::Result::CartProduct", "carts_id";

=head2 session

Type: belongs_to

Related object: L<Interchange6::Schema::Result::Session>

=cut

belongs_to
  session => "Interchange6::Schema::Result::Session",
  { sessions_id => "sessions_id" },
  {
    is_deferrable => 1,
    on_delete     => "SET NULL",
    join_type     => "left"
  };

=head2 user

Type: belongs_to

Related object: L<Interchange6::Schema::Result::User>

=cut

belongs_to
  user => "Interchange6::Schema::Result::User",
  { users_id => "users_id" },
  {
    is_deferrable => 1,
    on_delete     => "CASCADE",
    on_update     => "CASCADE",
    join_type     => "left"
  };

1;
