--liquibase formatted sql

--changeset reya:users_table runInTransaction:false
CREATE TABLE IF NOT EXISTS users
(
    id                UUID NOT NULL PRIMARY KEY DEFAULT gen_random_uuid(),
    discord_snowflake INT  NOT NULL,
    INDEX discord_users (discord_snowflake)
);
--rollback DROP TABLE IF EXISTS users;

--changeset reya:types_table runInTransaction:false
CREATE TABLE IF NOT EXISTS types
(
    id            INT    NOT NULL PRIMARY KEY,
    name          STRING NOT NULL,
    color         STRING NOT NULL,
    display_order INT    NOT NULL,
    immunities    INT[]  NOT NULL DEFAULT '{}',
    resistances   INT[]  NOT NULL DEFAULT '{}',
    weaknesses    INT[]  NOT NULL DEFAULT '{}'
);
--rollback DROP TABLE IF EXISTS types;

--changeset reya:types_values runInTransaction:true
INSERT INTO types (id, name, color, display_order)
VALUES (0, 'Basic', '', 0),
       (1, 'Sassy', '', 1),
       (2, 'Gentle', '', 2),
       (3, 'Sexy', '', 3),
       (4, 'Muscle', '', 4),
       (5, 'Glam', '', 5),
       (6, 'Punk', '', 6),
       (7, 'Glutton', '', 7),
       (8, 'Dumb', '', 8),
       (9, 'Drone', '', 9),
       (10, 'Spooky', '', 10),
       (11, 'Lively', '', 11),
       (12, 'Smart', '', 12),
       (13, 'Cool', '', 13),
       (14, 'Bully', '', 14),
       (15, 'Mythic', '', 15),
       (16, 'Toy', '', 16),
       (17, 'Cute', '', 17);
--rollback DELETE FROM types WHERE id in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)

--changeset reya:difficulties_table runInTransaction:false
CREATE TABLE IF NOT EXISTS difficulties
(
    id                       INT     NOT NULL PRIMARY KEY,
    name                     STRING  NOT NULL,
    description              STRING  NOT NULL,
    display_order            INT     NOT NULL,
    endo_only                BOOLEAN NOT NULL DEFAULT false,
    regenerate_talent        BOOLEAN NOT NULL DEFAULT false,
    lose_proficiency_percent FLOAT   NOT NULL DEFAULT 0,
    lose_exp_percent         FLOAT   NOT NULL DEFAULT 0,
    lose_money_percent       FLOAT   NOT NULL DEFAULT 0,
    allow_reformation        BOOLEAN NOT NULL DEFAULT true
);
--rollback DROP TABLE IF EXISTS difficulties;

--changeset reya:difficulties_values runInTransaction:true
INSERT INTO difficulties
(id, name, description, display_order, endo_only, regenerate_talent, lose_proficiency_percent, lose_exp_percent,
 lose_money_percent, allow_reformation)
VALUES (0, 'Endo Only', 'You can never be digested. You always come out sooner or later.', 0, true, false, 0, 0, 0,
        true),
       (1, 'Very Safe',
        'You''ll be completely safe. The only downsides to being digested? Inconvenience. And smug predators.', 1,
        false, false, 0, 0, 0, true),
       (2, 'Safe',
        'Your noggin will get rattled around, sure, and you might drop some of your cash, but it''s a small price to pay for being able to come back.',
        2, false, true, 10, 0, 10, true),
       (3, 'Risky',
        'Getting digested is going to mess with your head, for sure. You''ll come back a bit weakened from the experience, and your wallet will notice. This is the recommended difficulty.',
        3, false, true, 25, 10, 25, true),
       (4, 'Dangerous',
        'Digestion is something to be avoided at all costs. You''ll lose half your money, your stats will have atrophied, and you''ll lose some of your memories.',
        4, false, true, 50, 25, 50, true),
       (5, 'Very Dangerous',
        'Being a meal is not just humiliating - it''s a nightmare. You''re lucky you get to hold on to anything.', 5,
        false, true, 90, 50, 90, true),
       (6, 'Extremely Dangerous',
        'If you get devoured and you don''t get out, you''ll lose just about everything. Be very, very careful...', 6,
        false, true, 100, 100, 100, true),
       (7, 'Impossible',
        'There is nothing to look forward to after digestion but an eternity on someone else''s thighs. When you''re digested, your life is over. There''s no coming back. Ever.',
        7, false, true, 100, 100, 100, false);
--rollback DELETE FROM difficulties WHERE id IN (0, 1, 2, 3, 4, 5, 6, 7);

--changeset reya:preferences_table runInTransaction:false
CREATE TABLE IF NOT EXISTS preferences
(
    id               INT     NOT NULL PRIMARY KEY,
    name             STRING  NOT NULL,
    description      STRING  NOT NULL,
    display_order    INT     NOT NULL,
    can_use_vore     BOOLEAN NOT NULL,
    can_receive_vore BOOLEAN NOT NULL
);
--rollback DROP TABLE IF EXISTS preferences;

--changeset reya:preferences_values runInTransaction:true
INSERT INTO preferences (id, name, description, display_order, can_use_vore, can_receive_vore)
VALUES (0, 'Observer', 'You can neither eat nor be eaten.', 0, false, false),
       (1, 'Prey Only', 'You can only be eaten, not eat.', 1, false, true),
       (2, 'Pred Only', 'You can only eat, not be eaten.', 2, true, false),
       (3, 'Switch', 'You can both eat and be eaten.', 3, true, true);
--rollback DELETE FROM preferences WHERE id IN (0, 1, 2, 3);

--changeset reya:genders_table runInTransaction:false
CREATE TABLE IF NOT EXISTS genders
(
    id            INT     NOT NULL PRIMARY KEY,
    name          STRING  NOT NULL,
    display_order INT     NOT NULL,
    use_plural    BOOLEAN NOT NULL,
    subjective    STRING  NOT NULL,
    adjective     STRING  NOT NULL,
    possessive    STRING  NOT NULL,
    reflexive     STRING  NOT NULL,
    objective     STRING  NOT NULL
);
--rollback DROP TABLE IF EXISTS genders;

--changeset reya:genders_values runInTransaction:true
INSERT INTO genders (id, name, display_order, use_plural, subjective, adjective, possessive, reflexive, objective)
VALUES (0, 'Non-binary (name only)', 0, false, '@@', '@@''s', '@@''s', '@@''s self', '@@'),
       (1, 'Female (she/her)', 1, false, 'she', 'her', 'hers', 'herself', 'her'),
       (2, 'Non-binary (they/them)', 2, true, 'they', 'their', 'theirs', 'themself', 'them'),
       (3, 'Male (he/him)', 3, false, 'he', 'his', 'his', 'himself', 'him'),
       (4, 'Object (it/its)', 4, false, 'it', 'its', 'its', 'itself', 'it'),
       (5, 'Herm (shi/hir)', 5, false, 'shi', 'hir', 'hirs', 'hirself', 'hir'),
       (6, 'Non-binary (ae/aer)', 6, false, 'ae', 'aer', 'aers', 'aerself', 'aer'),
       (7, 'Non-binary (fae/faer)', 7, false, 'fae', 'faer', 'faers', 'faerself', 'faer'),
       (8, 'Non-binary (e/em)', 8, false, 'e', 'eir', 'eirs', 'emself', 'em'),
       (9, 'Non-binary (ey/em)', 9, false, 'ey', 'eir', 'eirs', 'emself', 'em'),
       (10, 'Non-binary (per/per)', 10, false, 'per', 'pers', 'pers', 'perself', 'per'),
       (11, 'Non-binary (ve/ver)', 11, false, 've', 'vis', 'vis', 'verself', 'ver'),
       (12, 'Non-binary (xe/xem)', 12, false, 'xe', 'xyr', 'xyrs', 'xemself', 'xem'),
       (13, 'Non-binary (ze/hir)', 13, false, 'ze', 'hir', 'hirs', 'hirself', 'hir'),
       (14, 'Non-binary (zie/hir)', 14, false, 'zie', 'hir', 'hirs', 'hirself', 'hir'),
       (15, 'Non-binary (zie/zim)', 15, false, 'zie', 'zir', 'zis', 'zieself', 'zim'),
       (16, 'Non-binary (sie/sie)', 16, false, 'sie', 'hir', 'hirs', 'hirself', 'sie'),
       (17, 'Non-binary (te/ter)', 17, false, 'te', 'tem', 'ters', 'terself', 'ter');
--rollback DELETE FROM genders WHERE id IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);

--changeset reya:characters_table runInTransaction:false
CREATE TABLE IF NOT EXISTS characters
(
    id                     UUID   NOT NULL PRIMARY KEY,
    user_id                UUID   NOT NULL REFERENCES users (id) ON DELETE CASCADE,
    name                   STRING NOT NULL,
    title                  STRING NOT NULL,
    profile                STRING NOT NULL,
    gender_id              INT    NOT NULL REFERENCES genders (id) ON DELETE RESTRICT,
    difficulty_id          INT    NOT NULL REFERENCES difficulties (id) ON DELETE RESTRICT,
    preference_id          INT    NOT NULL REFERENCES preferences (id) ON DELETE RESTRICT,
    type1_id               INT    NOT NULL REFERENCES types (id) ON DELETE RESTRICT,
    type2_id               INT    NOT NULL REFERENCES types (id) ON DELETE RESTRICT,
    experience             INT    NOT NULL                                          DEFAULT 0,
    money                  INT    NOT NULL                                          DEFAULT 0,

    -- stats: base
    base_confidence        INT    NOT NULL                                          DEFAULT 70,
    base_health            INT    NOT NULL                                          DEFAULT 70,
    base_stamina           INT    NOT NULL                                          DEFAULT 70,
    base_brawn             INT    NOT NULL                                          DEFAULT 70,
    base_durability        INT    NOT NULL                                          DEFAULT 70,
    base_intensity         INT    NOT NULL                                          DEFAULT 70,
    base_resilience        INT    NOT NULL                                          DEFAULT 70,
    base_speed             INT    NOT NULL                                          DEFAULT 70,
    -- stats: banked talent points
    min_confidence_talent  INT    NOT NULL                                          DEFAULT 0,
    min_health_talent      INT    NOT NULL                                          DEFAULT 0,
    min_stamina_talent     INT    NOT NULL                                          DEFAULT 0,
    min_brawn_talent       INT    NOT NULL                                          DEFAULT 0,
    min_durability_talent  INT    NOT NULL                                          DEFAULT 0,
    min_intensity_talent   INT    NOT NULL                                          DEFAULT 0,
    min_resilience_talent  INT    NOT NULL                                          DEFAULT 0,
    min_speed_talent       INT    NOT NULL                                          DEFAULT 0,
    -- stats: current talent points
    confidence_talent      INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_confidence_talent + floor(random() * (32 - min_confidence_talent)),
    health_talent          INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_health_talent + floor(random() * (32 - min_health_talent)),
    stamina_talent         INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_stamina_talent + floor(random() * (32 - min_stamina_talent)),
    brawn_talent           INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_brawn_talent + floor(random() * (32 - min_brawn_talent)),
    durability_talent      INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_durability_talent + floor(random() * (32 - min_durability_talent)),
    intensity_talent       INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_intensity_talent + floor(random() * (32 - min_intensity_talent)),
    resilience_talent      INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_resilience_talent + floor(random() * (32 - min_resilience_talent)),
    speed_talent           INT    NOT NULL                                          DEFAULT floor(random() * 32)::INT, --min_speed_talent + floor(random() * (32 - min_speed_talent)),
    -- stats: current proficiency points
    confidence_proficiency INT    NOT NULL                                          DEFAULT 0,
    health_proficiency     INT    NOT NULL                                          DEFAULT 0,
    stamina_proficiency    INT    NOT NULL                                          DEFAULT 0,
    brawn_proficiency      INT    NOT NULL                                          DEFAULT 0,
    durability_proficiency INT    NOT NULL                                          DEFAULT 0,
    intensity_proficiency  INT    NOT NULL                                          DEFAULT 0,
    resilience_proficiency INT    NOT NULL                                          DEFAULT 0,
    speed_proficiency      INT    NOT NULL                                          DEFAULT 0,

    FAMILY character_base (id, user_id, name, title, profile, gender_id, type1_id, type2_id, base_confidence,
                           base_health,
                           base_stamina, base_brawn, base_durability, base_intensity, base_resilience, base_speed),
    FAMILY character_reformation_stats (
                                        min_confidence_talent, min_health_talent, min_stamina_talent, min_brawn_talent,
                                        min_durability_talent, min_intensity_talent, min_resilience_talent,
                                        min_speed_talent,
                                        confidence_talent, health_talent, stamina_talent, brawn_talent,
                                        durability_talent, intensity_talent, resilience_talent, speed_talent),
    FAMILY character_live_stats (difficulty_id, preference_id, experience, money, confidence_proficiency,
                                 health_proficiency, stamina_proficiency, brawn_proficiency, durability_proficiency,
                                 intensity_proficiency, resilience_proficiency, speed_proficiency)
);
--rollback DROP TABLE IF EXISTS characters_table;