use Red::AST;
#| Represents an alter table alter column
unit class Red::AST::ChangeColumn does Red::AST;

has Str  $.table is required;
has Str  $.name  is required;
has Str  $.type;
has Bool $.nullable;
has Bool $.pk;
has Bool $.unique;
has Str  $.ref-table;
has Str  $.ref-col;

method find-column-name {}
method args {}
method returns {}

# TODO: Fix
method optimize(@changes) {
    my %lists = @changes.classify: { $_ ~~ ::?CLASS ?? "changes" !! "other" };
    my %cols  = .?classify: { .?name } with %lists<changes>;

    my @c = %cols.values.map({::?CLASS.new: |%(|.map({
        |("table"     , $_ with .table),
        |("name"      , $_ with .name),
        |("type"      , $_ with .type),
        |("nullable"  , $_ with .nullable),
        |("pk"        , $_ with .pk),
        |("unique"    , $_ with .unique),
        |("ref-table" , $_ with .ref-table),
        |("ref-col"   , $_ with .ref-col),
    }))});

    [
        |%lists<other>,
        |@c
    ]
}
