package Doodle::Column::Helpers;

use 5.014;

use strict;
use warnings;

use registry 'Doodle::Library';
use routines;

use Data::Object::Role;

our $VERSION = '0.08'; # VERSION

# BUILD
# METHODS

method binary(Any %args) {
  $self->type('binary');

  $self->stash(%args) if %args;

  return $self;
}

method boolean(Any %args) {
  $self->type('boolean');

  $self->stash(%args) if %args;

  return $self;
}

method char(Any %args) {
  $self->type('char');

  $self->stash(%args) if %args;

  return $self;
}

method date(Any %args) {
  $self->type('date');

  $self->stash(%args) if %args;

  return $self;
}

method datetime(Any %args) {
  $self->type('datetime');

  $self->stash(%args) if %args;

  return $self;
}

method datetime_tz(Any %args) {
  $self->type('datetime_tz');

  $self->stash(%args) if %args;

  return $self;
}

method decimal(Any %args) {
  $self->type('decimal');

  $self->stash(%args) if %args;

  return $self;
}

method default(Str @args) {
  unshift @args, 'deduce' if @args == 1;

  $self->stash(default => [@args]);

  return $self;
}

method default_current_date() {
  $self->default(function => 'CURRENT_DATE');

  return $self;
}

method default_current_time() {
  $self->default(function => 'CURRENT_TIME');

  return $self;
}

method default_current_datetime() {
  $self->default(function => 'CURRENT_TIMESTAMP');

  return $self;
}

method double(Any %args) {
  $self->type('double');

  $self->stash(%args) if %args;

  return $self;
}

method enum(Any %args) {
  $self->type('enum');

  $self->stash(%args) if %args;

  return $self;
}

method float(Any %args) {
  $self->type('float');

  $self->stash(%args) if %args;

  return $self;
}

method primary() {
  $self->stash(primary => 1);

  return $self;
}

method increments() {
  $self->stash(increments => 1);

  $self->integer if $self->type !~ /integer/;

  return $self;
}

method increments_big(Any %args) {
  $self->integer_big(%args);
  $self->increments;

  return $self;
}

method increments_medium(Any %args) {
  $self->integer_medium(%args);
  $self->increments;

  return $self;
}

method increments_small(Any %args) {
  $self->integer_small(%args);
  $self->increments;

  return $self;
}

method integer(Any %args) {
  $self->type('integer');

  $self->stash(%args) if %args;

  return $self;
}

method integer_big(Any %args) {
  $self->type('integer_big');

  $self->stash(%args) if %args;

  return $self;
}

method integer_big_unsigned(Any %args) {
  $self->type('integer_big_unsigned');

  $self->stash(%args) if %args;

  return $self;
}

method integer_medium(Any %args) {
  $self->type('integer_medium');

  $self->stash(%args) if %args;

  return $self;
}

method integer_medium_unsigned(Any %args) {
  $self->type('integer_medium_unsigned');

  $self->stash(%args) if %args;

  return $self;
}

method integer_small(Any %args) {
  $self->type('integer_small');

  $self->stash(%args) if %args;

  return $self;
}

method integer_small_unsigned(Any %args) {
  $self->type('integer_small_unsigned');

  $self->stash(%args) if %args;

  return $self;
}

method integer_tiny(Any %args) {
  $self->type('integer_tiny');

  $self->stash(%args) if %args;

  return $self;
}

method integer_tiny_unsigned(Any %args) {
  $self->type('integer_tiny_unsigned');

  $self->stash(%args) if %args;

  return $self;
}

method integer_unsigned(Any %args) {
  $self->type('integer_unsigned');

  $self->stash(%args) if %args;

  return $self;
}

method json(Any %args) {
  $self->type('json');

  $self->stash(%args) if %args;

  return $self;
}

method null(Any %args) {
  $self->stash(%args, nullable => 1);

  return $self;
}

method not_null(Any %args) {
  $self->stash(%args, nullable => 0);

  return $self;
}

method references(Str $ftable, Str @args) {
  my $table = $self->table;

  return $table->relation($self->name, $ftable, @args);
}

method string(Any %args) {
  $self->type('string');

  $self->stash(%args) if %args;

  return $self;
}

method text(Any %args) {
  $self->type('text');

  $self->stash(%args) if %args;

  return $self;
}

method text_long(Any %args) {
  $self->type('text_long');

  $self->stash(%args) if %args;

  return $self;
}

method text_medium(Any %args) {
  $self->type('text_medium');

  $self->stash(%args) if %args;

  return $self;
}

method time(Any %args) {
  $self->type('time');

  $self->stash(%args) if %args;

  return $self;
}

method time_tz(Any %args) {
  $self->type('time_tz');

  $self->stash(%args) if %args;

  return $self;
}

method timestamp(Any %args) {
  $self->type('timestamp');

  $self->stash(%args) if %args;

  return $self;
}

method timestamp_tz(Any %args) {
  $self->type('timestamp_tz');

  $self->stash(%args) if %args;

  return $self;
}

method uuid(Any %args) {
  $self->type('uuid');

  $self->stash(%args) if %args;

  return $self;
}

1;

=encoding utf8

=head1 NAME

Doodle::Column::Helpers

=cut

=head1 ABSTRACT

Doodle Column Helpers

=cut

=head1 SYNOPSIS

  use Doodle::Column;

  use Doodle;
  use Doodle::Column;
  use Doodle::Table;

  my $ddl = Doodle->new;

  my $table = Doodle::Table->new(
    name => 'users',
    doodle => $ddl
  );

  my $self = Doodle::Column->new(
    name => 'id',
    table => $table,
    doodle => $ddl
  );

=cut

=head1 DESCRIPTION

Helpers for configuring Column classes.

=cut

=head1 LIBRARIES

This package uses type constraints from:

L<Doodle::Library>

=cut

=head1 METHODS

This package implements the following methods:

=cut

=head2 binary

  binary(Any %args) : Column

Configures a binary column and returns itself.

=over 4

=item binary example #1

  # given: synopsis

  my $binary = $self->binary;

=back

=cut

=head2 boolean

  boolean(Any %args) : Column

Configures a boolean column and returns itself.

=over 4

=item boolean example #1

  # given: synopsis

  my $boolean = $self->boolean;

=back

=cut

=head2 char

  char(Any %args) : Column

Configures a char column and returns itself.

=over 4

=item char example #1

  # given: synopsis

  my $char = $self->char;

=back

=cut

=head2 date

  date(Any %args) : Column

Configures a date column and returns itself.

=over 4

=item date example #1

  # given: synopsis

  my $date = $self->date;

=back

=cut

=head2 datetime

  datetime(Any %args) : Column

Configures a datetime column and returns itself.

=over 4

=item datetime example #1

  # given: synopsis

  my $datetime = $self->datetime;

=back

=cut

=head2 datetime_tz

  datetime_tz(Any %args) : Column

Configures a datetime column with timezone and returns itself.

=over 4

=item datetime_tz example #1

  # given: synopsis

  my $datetime_tz = $self->datetime_tz;

=back

=cut

=head2 decimal

  decimal(Any %args) : Column

Configures a decimal column and returns itself.

=over 4

=item decimal example #1

  # given: synopsis

  my $decimal = $self->decimal;

=back

=cut

=head2 default

  default(Str @args) : Column

Configures a default value and returns itself.

=over 4

=item default example #1

  # given: synopsis

  my $default = $self->default(123);

  # produces, default 123

=back

=over 4

=item default example #2

  # given: synopsis

  my $default = $self->default(string => 123);

  # produces, default '123'

=back

=over 4

=item default example #3

  # given: synopsis

  my $default = $self->default(integer => 123);

  # produces, default 123

=back

=over 4

=item default example #4

  # given: synopsis

  my $default = $self->default(function => 'current_timestamp');

  # produces, default CURRENT_TIMESTAMP

=back

=cut

=head2 default_current_date

  default_current_date() : Column

Configures a C<CURRENT_DATE> default value and returns itself.

=over 4

=item default_current_date example #1

  # given: synopsis

  my $default = $self->default_current_date;

=back

=cut

=head2 default_current_datetime

  default_current_datetime() : Column

Configures a C<CURRENT_TIMESTAMP> default value and returns itself.

=over 4

=item default_current_datetime example #1

  # given: synopsis

  my $default = $self->default_current_datetime;

=back

=cut

=head2 default_current_time

  default_current_time() : Column

Configures a C<CURRENT_TIME> default value and returns itself.

=over 4

=item default_current_time example #1

  # given: synopsis

  my $default = $self->default_current_time;

=back

=cut

=head2 double

  double(Any %args) : Column

Configures a double column and returns itself.

=over 4

=item double example #1

  # given: synopsis

  my $double = $self->double;

=back

=cut

=head2 enum

  enum(Any %args) : Column

Configures an enum column and returns itself.

=over 4

=item enum example #1

  # given: synopsis

  my $enum = $self->enum(options => [
    'red', 'blue', 'green'
  ]);

=back

=cut

=head2 float

  float(Any %args) : Column

Configures a float column and returns itself.

=over 4

=item float example #1

  # given: synopsis

  my $float = $self->float;

=back

=cut

=head2 increments

  increments() : Column

Denotes that the column auto-increments and returns the Column object.

=over 4

=item increments example #1

  # given: synopsis

  my $increments = $self->increments;

=back

=cut

=head2 increments_big

  increments_big(Any %args) : Column

Configures an auto-incrementing big integer (8-byte) column and returns itself.

=over 4

=item increments_big example #1

  # given: synopsis

  my $increments_big = $self->increments_big;

=back

=cut

=head2 increments_medium

  increments_medium(Any %args) : Column

Configures an auto-incrementing medium integer (3-byte) column and returns itself.

=over 4

=item increments_medium example #1

  # given: synopsis

  my $increments_medium = $self->increments_medium;

=back

=cut

=head2 increments_small

  increments_small(Any %args) : Column

Configures an auto-incrementing small integer (2-byte) column and returns itself.

=over 4

=item increments_small example #1

  # given: synopsis

  my $increments_small = $self->increments_small;

=back

=cut

=head2 integer

  integer(Any %args) : Column

Configures an integer (4-byte) column and returns itself.

=over 4

=item integer example #1

  # given: synopsis

  my $integer = $self->integer;

=back

=cut

=head2 integer_big

  integer_big(Any %args) : Column

Configures a big integer (8-byte) column and returns itself.

=over 4

=item integer_big example #1

  # given: synopsis

  my $integer_big = $self->integer_big;

=back

=cut

=head2 integer_big_unsigned

  integer_big_unsigned(Any %args) : Column

Configures an unsigned big integer (8-byte) column and returns itself.

=over 4

=item integer_big_unsigned example #1

  # given: synopsis

  my $integer_big_unsigned = $self->integer_big_unsigned;

=back

=cut

=head2 integer_medium

  integer_medium(Any %args) : Column

Configures a medium integer (3-byte) column and returns itself.

=over 4

=item integer_medium example #1

  # given: synopsis

  my $integer_medium = $self->integer_medium;

=back

=cut

=head2 integer_medium_unsigned

  integer_medium_unsigned(Any %args) : Column

Configures an unsigned medium integer (3-byte) column and returns itself.

=over 4

=item integer_medium_unsigned example #1

  # given: synopsis

  my $integer_medium_unsigned = $self->integer_medium_unsigned;

=back

=cut

=head2 integer_small

  integer_small(Any %args) : Column

Configures a small integer (2-byte) column and returns itself.

=over 4

=item integer_small example #1

  # given: synopsis

  my $integer_small = $self->integer_small;

=back

=cut

=head2 integer_small_unsigned

  integer_small_unsigned(Any %args) : Column

Configures an unsigned small integer (2-byte) column and returns itself.

=over 4

=item integer_small_unsigned example #1

  # given: synopsis

  my $integer_small_unsigned = $self->integer_small_unsigned;

=back

=cut

=head2 integer_tiny

  integer_tiny(Any %args) : Column

Configures a tiny integer (1-byte) column and returns itself.

=over 4

=item integer_tiny example #1

  # given: synopsis

  my $integer_tiny = $self->integer_tiny;

=back

=cut

=head2 integer_tiny_unsigned

  integer_tiny_unsigned(Any %args) : Column

Configures an unsigned tiny integer (1-byte) column and returns itself.

=over 4

=item integer_tiny_unsigned example #1

  # given: synopsis

  my $integer_tiny_unsigned = $self->integer_tiny_unsigned;

=back

=cut

=head2 integer_unsigned

  integer_unsigned(Any %args) : Column

Configures an unsigned integer (4-byte) column and returns itself.

=over 4

=item integer_unsigned example #1

  # given: synopsis

  my $integer_unsigned = $self->integer_unsigned;

=back

=cut

=head2 json

  json(Any %args) : Column

Configures a JSON column and returns itself.

=over 4

=item json example #1

  # given: synopsis

  my $json = $self->json;

=back

=cut

=head2 not_null

  not_null(Any %args) : Column

Denotes that the Column is not nullable and returns itself.

=over 4

=item not_null example #1

  # given: synopsis

  my $not_null = $self->not_null;

=back

=cut

=head2 null

  null(Any %args) : Column

Denotes that the Column is nullable and returns itself.

=over 4

=item null example #1

  # given: synopsis

  my $null = $self->null;

=back

=cut

=head2 primary

  primary(Any %args) : Column

Denotes that the column is the primary key and returns the Column object.

=over 4

=item primary example #1

  # given: synopsis

  my $primary = $self->primary('id');

=back

=cut

=head2 references

  references(Str $table, Str $column) : Relation

Configures a relation and returns the Relation object.

=over 4

=item references example #1

  # given: synopsis

  my $references = $self->references('entities');

=back

=over 4

=item references example #2

  # given: synopsis

  my $references = $self->references('entities', 'uuid');

=back

=cut

=head2 string

  string(Any %args) : Column

Configures a string column and returns itself.

=over 4

=item string example #1

  # given: synopsis

  my $string = $self->string;

=back

=cut

=head2 text

  text(Any %args) : Column

Configures a text column and returns itself.

=over 4

=item text example #1

  # given: synopsis

  my $text = $self->text;

=back

=cut

=head2 text_long

  text_long(Any %args) : Column

Configures a long text column and returns itself.

=over 4

=item text_long example #1

  # given: synopsis

  my $text_long = $self->text_long;

=back

=cut

=head2 text_medium

  text_medium(Any %args) : Column

Configures a medium text column and returns itself.

=over 4

=item text_medium example #1

  # given: synopsis

  my $text_medium = $self->text_medium;

=back

=cut

=head2 time

  time(Any %args) : Column

Configures a time column and returns itself.

=over 4

=item time example #1

  # given: synopsis

  my $time = $self->time;

=back

=cut

=head2 time_tz

  time_tz(Any %args) : Column

Configures a time column with timezone and returns itself.

=over 4

=item time_tz example #1

  # given: synopsis

  my $time_tz = $self->time_tz;

=back

=cut

=head2 timestamp

  timestamp(Any %args) : Column

Configures a timestamp column and returns itself.

=over 4

=item timestamp example #1

  # given: synopsis

  my $timestamp = $self->timestamp;

=back

=cut

=head2 timestamp_tz

  timestamp_tz(Any %args) : Column

Configures a timestamp_tz column and returns itself.

=over 4

=item timestamp_tz example #1

  # given: synopsis

  my $timestamp_tz = $self->timestamp_tz;

=back

=cut

=head2 uuid

  uuid(Any %args) : Column

Configures a uuid column and returns itself.

=over 4

=item uuid example #1

  # given: synopsis

  my $uuid = $self->uuid;

=back

=cut

=head1 AUTHOR

Al Newkirk, C<awncorp@cpan.org>

=head1 LICENSE

Copyright (C) 2011-2019, Al Newkirk, et al.

This is free software; you can redistribute it and/or modify it under the terms
of the The Apache License, Version 2.0, as elucidated in the L<"license
file"|https://github.com/iamalnewkirk/doodle/blob/master/LICENSE>.

=head1 PROJECT

L<Wiki|https://github.com/iamalnewkirk/doodle/wiki>

L<Project|https://github.com/iamalnewkirk/doodle>

L<Initiatives|https://github.com/iamalnewkirk/doodle/projects>

L<Milestones|https://github.com/iamalnewkirk/doodle/milestones>

L<Contributing|https://github.com/iamalnewkirk/doodle/blob/master/CONTRIBUTE.md>

L<Issues|https://github.com/iamalnewkirk/doodle/issues>

=cut