-- drop table if exists model_data_point;
-- drop table if exists model_definition_layer;
-- drop table if exists model_definition;
-- drop table if exists models;
create table if not exists models (
    id uuid primary key default gen_random_uuid(),
    user_id uuid references users (id) not null,
    name varchar (70) not null,
    -- Status:
    -- -1: failed preparing
    -- 1: preparing
    status integer default 1,

    -- Types:
    -- 0: Unset
    -- 1: simple
    -- 2: expandable
    model_type integer default 0,

    can_train integer default 1,
    width integer,
    height integer,
    color_mode varchar (20),
    format varchar (20) default ''
);

-- drop table if exists model_data_point;
-- drop table if exists model_classes;
create table if not exists model_classes (
    id uuid primary key default gen_random_uuid(),
    model_id uuid references models (id) on delete cascade,
    name varchar (70) not null,
    class_order integer,

    -- 1: to_train
    -- 2: training
    -- 3: trained
    status integer default 1,
);

-- drop table if exists model_data_point;
create table if not exists model_data_point (
    id uuid primary key default gen_random_uuid(),
    class_id uuid references model_classes (id) on delete cascade,
    file_path text not null,
    -- 1 training
    -- 2 testing
    model_mode integer default 1,
    -- -1 Error on creation
    -- 1 OK
    status integer not null,
    status_message text
);

-- drop table if exists model_definition;
create table if not exists model_definition (
    id uuid primary key default gen_random_uuid(),
    model_id uuid references models (id) on delete cascade,
    accuracy real default 0,
    target_accuracy integer not null,
    epoch integer default 0,
    -- TODO add max epoch
    -- 1: Pre Init
    -- 2: Init
    -- 3: Training
    -- 4: Tranied
    -- 5: Ready
    status integer default 1,
    created_on timestamp default current_timestamp,
    epoch_progress integer default 0
);

-- drop table if exists model_definition_layer;
create table if not exists model_definition_layer (
    id uuid primary key default gen_random_uuid(),
    def_id uuid references model_definition (id) on delete cascade,
    layer_order integer not null,
    -- 1: input
    -- 2: dense
    -- 3: flatten
    -- TODO add conv
    layer_type integer not null,
    -- ei 28,28,1
    -- a 28x28 grayscale image
    shape text not null,

    -- Type based on the expandability
    -- 0: not expandalbe model
    -- 1: fixed
    -- 2: head
    exp_type integer default 0
);

-- drop table if exists exp_model_head;
create table if not exists exp_model_head (
    id uuid primary key default gen_random_uuid(),
    def_id uuid references model_definition (id) on delete cascade,
    -- Start order id to the class that this model satifies inclusive
    range_start integer not null,
    -- end order id to the class that this model satifies inclusive
    range_end integer not null,

    accuracy real default 0,

    -- TODO add max epoch
    -- 1: Pre Init
    -- 2: Init
    -- 3: Training
    -- 4: Tranied
    -- 5: Ready
    status integer default 1,
    created_on timestamp default current_timestamp,
    epoch_progress integer default 0
);
