CREATE TABLE IF NOT EXISTS "__EFMigrationsHistory" (
    "MigrationId" character varying(150) NOT NULL,
    "ProductVersion" character varying(32) NOT NULL,
    CONSTRAINT "PK___EFMigrationsHistory" PRIMARY KEY ("MigrationId")
);

START TRANSACTION;

CREATE TABLE "Seasons" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "Year" integer NOT NULL,
    "Name" character varying(160) NOT NULL,
    "IsCurrent" boolean NOT NULL,
    "IsCommunityOnly" boolean NOT NULL,
    "CurrentPhase" character varying(60) NOT NULL,
    "NominationStartsAt" date NOT NULL,
    "NominationEndsAt" date NOT NULL,
    "VotingStartsAt" date NOT NULL,
    "VotingEndsAt" date NOT NULL,
    "ReviewStartsAt" date NOT NULL,
    "ReviewEndsAt" date NOT NULL,
    "ShowDate" date NOT NULL,
    CONSTRAINT "PK_Seasons" PRIMARY KEY ("Id")
);

CREATE TABLE "Categories" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "SeasonId" integer NOT NULL,
    "GroupName" character varying(80) NOT NULL,
    "Name" character varying(120) NOT NULL,
    "Slug" text NOT NULL,
    "Description" character varying(400) NOT NULL,
    "SortOrder" integer NOT NULL,
    "MaxNomineesPerUser" integer NOT NULL,
    CONSTRAINT "PK_Categories" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Categories_Seasons_SeasonId" FOREIGN KEY ("SeasonId") REFERENCES "Seasons" ("Id") ON DELETE CASCADE
);

CREATE TABLE "VoteBallots" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "SeasonId" integer NOT NULL,
    "SubmittedByTwitchId" character varying(120) NOT NULL,
    "Status" character varying(30) NOT NULL,
    "SubmittedAt" timestamp with time zone NOT NULL,
    CONSTRAINT "PK_VoteBallots" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_VoteBallots_Seasons_SeasonId" FOREIGN KEY ("SeasonId") REFERENCES "Seasons" ("Id") ON DELETE CASCADE
);

CREATE TABLE "Candidates" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "SeasonId" integer NOT NULL,
    "CategoryId" integer NOT NULL,
    "DisplayName" character varying(120) NOT NULL,
    "ChannelSlug" character varying(120) NOT NULL,
    "Platform" character varying(40) NOT NULL,
    CONSTRAINT "PK_Candidates" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Candidates_Categories_CategoryId" FOREIGN KEY ("CategoryId") REFERENCES "Categories" ("Id") ON DELETE CASCADE,
    CONSTRAINT "FK_Candidates_Seasons_SeasonId" FOREIGN KEY ("SeasonId") REFERENCES "Seasons" ("Id") ON DELETE CASCADE
);

CREATE TABLE "Nominations" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "SeasonId" integer NOT NULL,
    "CategoryId" integer NOT NULL,
    "SubmittedByTwitchId" character varying(120) NOT NULL,
    "CandidateId" integer,
    "CandidateText" character varying(120),
    "CreatedAt" timestamp with time zone NOT NULL,
    CONSTRAINT "PK_Nominations" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Nominations_Candidates_CandidateId" FOREIGN KEY ("CandidateId") REFERENCES "Candidates" ("Id"),
    CONSTRAINT "FK_Nominations_Categories_CategoryId" FOREIGN KEY ("CategoryId") REFERENCES "Categories" ("Id") ON DELETE CASCADE,
    CONSTRAINT "FK_Nominations_Seasons_SeasonId" FOREIGN KEY ("SeasonId") REFERENCES "Seasons" ("Id") ON DELETE CASCADE
);

CREATE TABLE "Results" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "SeasonId" integer NOT NULL,
    "CandidateId" integer NOT NULL,
    "CategoryName" character varying(120) NOT NULL,
    CONSTRAINT "PK_Results" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_Results_Candidates_CandidateId" FOREIGN KEY ("CandidateId") REFERENCES "Candidates" ("Id") ON DELETE CASCADE,
    CONSTRAINT "FK_Results_Seasons_SeasonId" FOREIGN KEY ("SeasonId") REFERENCES "Seasons" ("Id") ON DELETE CASCADE
);

CREATE TABLE "VoteEntries" (
    "Id" integer GENERATED BY DEFAULT AS IDENTITY,
    "BallotId" integer NOT NULL,
    "CategoryId" integer NOT NULL,
    "CandidateId" integer NOT NULL,
    CONSTRAINT "PK_VoteEntries" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_VoteEntries_Candidates_CandidateId" FOREIGN KEY ("CandidateId") REFERENCES "Candidates" ("Id") ON DELETE CASCADE,
    CONSTRAINT "FK_VoteEntries_Categories_CategoryId" FOREIGN KEY ("CategoryId") REFERENCES "Categories" ("Id") ON DELETE CASCADE,
    CONSTRAINT "FK_VoteEntries_VoteBallots_BallotId" FOREIGN KEY ("BallotId") REFERENCES "VoteBallots" ("Id") ON DELETE CASCADE
);

INSERT INTO "Seasons" ("Id", "CurrentPhase", "IsCommunityOnly", "IsCurrent", "Name", "NominationEndsAt", "NominationStartsAt", "ReviewEndsAt", "ReviewStartsAt", "ShowDate", "VotingEndsAt", "VotingStartsAt", "Year")
VALUES (1, 'Community Voting', TRUE, TRUE, 'VTuber Star Awards 2026', DATE '2026-05-31', DATE '2026-05-01', DATE '2026-07-10', DATE '2026-07-01', DATE '2026-07-20', DATE '2026-06-30', DATE '2026-06-01', 2026);
INSERT INTO "Seasons" ("Id", "CurrentPhase", "IsCommunityOnly", "IsCurrent", "Name", "NominationEndsAt", "NominationStartsAt", "ReviewEndsAt", "ReviewStartsAt", "ShowDate", "VotingEndsAt", "VotingStartsAt", "Year")
VALUES (2, 'Archived', TRUE, FALSE, 'VTuber Star Awards 2025', DATE '2025-05-31', DATE '2025-05-01', DATE '2025-07-10', DATE '2025-07-01', DATE '2025-07-20', DATE '2025-06-30', DATE '2025-06-01', 2025);
INSERT INTO "Seasons" ("Id", "CurrentPhase", "IsCommunityOnly", "IsCurrent", "Name", "NominationEndsAt", "NominationStartsAt", "ReviewEndsAt", "ReviewStartsAt", "ShowDate", "VotingEndsAt", "VotingStartsAt", "Year")
VALUES (3, 'Archived', TRUE, FALSE, 'VTuber Star Awards 2024', DATE '2024-05-31', DATE '2024-05-01', DATE '2024-07-10', DATE '2024-07-01', DATE '2024-07-20', DATE '2024-06-30', DATE '2024-06-01', 2024);
INSERT INTO "Seasons" ("Id", "CurrentPhase", "IsCommunityOnly", "IsCurrent", "Name", "NominationEndsAt", "NominationStartsAt", "ReviewEndsAt", "ReviewStartsAt", "ShowDate", "VotingEndsAt", "VotingStartsAt", "Year")
VALUES (4, 'Archived', TRUE, FALSE, 'VTuber Star Awards 2023', DATE '2023-05-31', DATE '2023-05-01', DATE '2023-07-10', DATE '2023-07-01', DATE '2023-07-20', DATE '2023-06-30', DATE '2023-06-01', 2023);

INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (1, 'Die groesste Auszeichnung des Jahres.', 'Main Awards', 3, 'VTuber des Jahres', 1, 'vtuber-des-jahres', 1);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (2, 'Events, Konzerte und 3D-Shows.', 'Performance', 3, 'Bestes Live Event', 1, 'bestes-live-event', 2);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (3, 'Der lustigste oder emotionalste Clip des Jahres.', 'Clips & Highlights', 3, 'Clip des Jahres', 1, 'clip-des-jahres', 3);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (4, 'Die aktivste und freundlichste Community.', 'Main Awards', 3, 'Beste Community', 1, 'beste-community', 4);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (5, 'Archivkategorie 2025.', 'Main Awards', 3, 'VTuber des Jahres', 2, 'vtuber-des-jahres', 1);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (6, 'Archivkategorie 2025.', 'Performance', 3, 'Bestes Live Event', 2, 'bestes-live-event', 2);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (7, 'Archivkategorie 2025.', 'Clips & Highlights', 3, 'Clip des Jahres', 2, 'clip-des-jahres', 3);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (8, 'Archivkategorie 2024.', 'Main Awards', 3, 'VTuber des Jahres', 3, 'vtuber-des-jahres', 1);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (9, 'Archivkategorie 2024.', 'Clips & Highlights', 3, 'Clip des Jahres', 3, 'clip-des-jahres', 2);
INSERT INTO "Categories" ("Id", "Description", "GroupName", "MaxNomineesPerUser", "Name", "SeasonId", "Slug", "SortOrder")
VALUES (10, 'Archivkategorie 2023.', 'Main Awards', 3, 'VTuber des Jahres', 4, 'vtuber-des-jahres', 1);

INSERT INTO "VoteBallots" ("Id", "SeasonId", "Status", "SubmittedAt", "SubmittedByTwitchId")
VALUES (1, 1, 'submitted', TIMESTAMPTZ '2026-06-11T12:00:00+00:00', 'twitch_vote_1');
INSERT INTO "VoteBallots" ("Id", "SeasonId", "Status", "SubmittedAt", "SubmittedByTwitchId")
VALUES (2, 1, 'submitted', TIMESTAMPTZ '2026-06-11T12:05:00+00:00', 'twitch_vote_2');

INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (1, 1, '@hoshimimiyu', 'Hoshimi Miyu', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (2, 1, '@kurainu', 'Kurainu', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (3, 1, '@shiroch', 'Shiro Ch.', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (4, 2, '@kurainu', 'Kurainu 3D Live', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (5, 2, '@aoisakura', 'Aoi Sakura Showcase', 'YouTube', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (6, 3, '@pyonkichikingdom', 'Pyonkichi Kingdom', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (7, 4, '@moonrelay', 'Moonrelay', 'Twitch', 1);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (8, 5, '@hoshimimiyu', 'Hoshimi Miyu', 'Twitch', 2);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (9, 6, '@kurainu', 'Kurainu 3D Live', 'Twitch', 2);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (10, 7, '@pyonkichikingdom', 'Pyonkichi Kingdom', 'Twitch', 2);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (11, 8, '@aoisakura', 'Aoi Sakura', 'YouTube', 3);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (12, 9, '@starbyte', 'Starbyte', 'Twitch', 3);
INSERT INTO "Candidates" ("Id", "CategoryId", "ChannelSlug", "DisplayName", "Platform", "SeasonId")
VALUES (13, 10, '@tenshivox', 'Tenshi Vox', 'Twitch', 4);

INSERT INTO "Nominations" ("Id", "CandidateId", "CandidateText", "CategoryId", "CreatedAt", "SeasonId", "SubmittedByTwitchId")
VALUES (1, NULL, 'Hoshimi Miyu', 1, TIMESTAMPTZ '2026-06-10T13:00:00+00:00', 1, 'twitch_hoshi');
INSERT INTO "Nominations" ("Id", "CandidateId", "CandidateText", "CategoryId", "CreatedAt", "SeasonId", "SubmittedByTwitchId")
VALUES (2, NULL, 'Kurainu 3D Live', 2, TIMESTAMPTZ '2026-06-10T14:00:00+00:00', 1, 'twitch_kurainu');

INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (1, 8, 'VTuber des Jahres', 2);
INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (2, 9, 'Bestes Live Event', 2);
INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (3, 10, 'Clip des Jahres', 2);
INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (4, 11, 'VTuber des Jahres', 3);
INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (5, 12, 'Clip des Jahres', 3);
INSERT INTO "Results" ("Id", "CandidateId", "CategoryName", "SeasonId")
VALUES (6, 13, 'VTuber des Jahres', 4);

INSERT INTO "VoteEntries" ("Id", "BallotId", "CandidateId", "CategoryId")
VALUES (1, 1, 1, 1);
INSERT INTO "VoteEntries" ("Id", "BallotId", "CandidateId", "CategoryId")
VALUES (2, 1, 4, 2);
INSERT INTO "VoteEntries" ("Id", "BallotId", "CandidateId", "CategoryId")
VALUES (3, 2, 2, 1);
INSERT INTO "VoteEntries" ("Id", "BallotId", "CandidateId", "CategoryId")
VALUES (4, 2, 6, 3);

CREATE INDEX "IX_Candidates_CategoryId" ON "Candidates" ("CategoryId");

CREATE INDEX "IX_Candidates_SeasonId" ON "Candidates" ("SeasonId");

CREATE UNIQUE INDEX "IX_Categories_SeasonId_Slug" ON "Categories" ("SeasonId", "Slug");

CREATE INDEX "IX_Nominations_CandidateId" ON "Nominations" ("CandidateId");

CREATE INDEX "IX_Nominations_CategoryId" ON "Nominations" ("CategoryId");

CREATE INDEX "IX_Nominations_SeasonId" ON "Nominations" ("SeasonId");

CREATE INDEX "IX_Results_CandidateId" ON "Results" ("CandidateId");

CREATE INDEX "IX_Results_SeasonId" ON "Results" ("SeasonId");

CREATE UNIQUE INDEX "IX_Seasons_Year" ON "Seasons" ("Year");

CREATE INDEX "IX_VoteBallots_SeasonId" ON "VoteBallots" ("SeasonId");

CREATE INDEX "IX_VoteEntries_BallotId" ON "VoteEntries" ("BallotId");

CREATE INDEX "IX_VoteEntries_CandidateId" ON "VoteEntries" ("CandidateId");

CREATE INDEX "IX_VoteEntries_CategoryId" ON "VoteEntries" ("CategoryId");

SELECT setval(
    pg_get_serial_sequence('"Seasons"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "Seasons") + 1,
        nextval(pg_get_serial_sequence('"Seasons"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"Categories"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "Categories") + 1,
        nextval(pg_get_serial_sequence('"Categories"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"VoteBallots"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "VoteBallots") + 1,
        nextval(pg_get_serial_sequence('"VoteBallots"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"Candidates"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "Candidates") + 1,
        nextval(pg_get_serial_sequence('"Candidates"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"Nominations"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "Nominations") + 1,
        nextval(pg_get_serial_sequence('"Nominations"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"Results"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "Results") + 1,
        nextval(pg_get_serial_sequence('"Results"', 'Id'))),
    false);
SELECT setval(
    pg_get_serial_sequence('"VoteEntries"', 'Id'),
    GREATEST(
        (SELECT MAX("Id") FROM "VoteEntries") + 1,
        nextval(pg_get_serial_sequence('"VoteEntries"', 'Id'))),
    false);

INSERT INTO "__EFMigrationsHistory" ("MigrationId", "ProductVersion")
VALUES ('20260617060000_InitialCreate', '8.0.11');

COMMIT;
