create table "User" (
	"id" integer primary key,
	"discordId" text unique not null,
	"discordName" text not null,
	"discordAvatar" text,
	"twitch" text,
	"youtubeId" text,
	"bio" text,
	"country" text,
	"patronTier" integer,
	"patronStartedAt" integer,
	"customUrl" text,
	"stickSens" integer,
	"motionSens" integer,
	"inGameName" text,
	"patronExpiresAt" integer,
	"discordUniqueName" text,
	"showDiscordUniqueName" integer not null default 1,
	"commissionText" text,
	"banned" integer default 0,
	"vc" text default "NO",
	"languages" text,
	"plusSkippedForSeasonNth" integer,
	"mapModePreferences" text,
	"weaponPool" text,
	"noScreen" integer default 0,
	"bannedReason" text,
	"customName" text,
	"username" text generated always as (coalesce("customName", "discordName")) virtual,
	"battlefy" text,
	"buildSorting" text,
	"bsky" text,
	"preferences" text,
	"favoriteBadgeIds" text,
	"createdAt" integer,
	"commissionsOpenedAt" integer,
	"pronouns" text default null,
	"customTheme" text default null,
	"joinOrder" integer,
	"customAvatarImgId" integer,
	"shortBio" text,
	"div" text,
	"unverifiedPeakXP" text,
	"bannerPresetImg" text,
	"bannerImgId" integer,
	"hiddenCardStats" text,
	"isArtist" integer not null default 0,
	"isVideoAdder" integer not null default 0,
	"isTournamentOrganizer" integer not null default 0,
	"isApiAccesser" integer not null default 0,
	"commissionsOpen" integer not null default 0,
	"favoriteTrophyIds" text,
	"hiddenTrophyIds" text
) strict;
--> statement-breakpoint
create table "PlusSuggestion" (
	"id" integer primary key,
	"text" text not null,
	"authorId" integer not null,
	"suggestedId" integer not null,
	"month" integer not null,
	"year" integer not null,
	"tier" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"updatedAt" integer,
	foreign key ("authorId") references "User" ("id") on delete cascade,
	foreign key ("suggestedId") references "User" ("id") on delete cascade,
	unique (
		"month",
		"year",
		"suggestedId",
		"authorId",
		"tier"
	)
	on conflict rollback
) strict;
--> statement-breakpoint
create index plus_suggestion_author_id on "PlusSuggestion" ("authorId");
--> statement-breakpoint
create index plus_suggestion_suggested_id on "PlusSuggestion" ("suggestedId");
--> statement-breakpoint
create table "PlusVote" (
	"month" integer not null,
	"year" integer not null,
	"tier" integer not null,
	"authorId" integer not null,
	"votedId" integer not null,
	"score" integer not null,
	"becomesValidAt" integer not null,
	foreign key ("authorId") references "User" ("id") on delete cascade,
	foreign key ("votedId") references "User" ("id") on delete cascade,
	unique ("month", "year", "authorId", "votedId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index plus_vote_author_id on "PlusVote" ("authorId");
--> statement-breakpoint
create index plus_vote_voted_id on "PlusVote" ("votedId");
--> statement-breakpoint
create table "Badge" (
	"id" integer primary key,
	"code" text not null,
	"displayName" text not null,
	"hue" integer,
	"authorId" integer
) strict;
--> statement-breakpoint
create table "TournamentBadgeOwner" (
	"badgeId" integer not null,
	"userId" integer not null,
	"tournamentId" integer,
	"count" integer not null default 1
) strict;
--> statement-breakpoint
create table "BadgeManager" (
	"badgeId" integer not null,
	"userId" integer not null,
	unique ("badgeId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "CalendarEvent" (
	"id" integer primary key,
	"name" text not null,
	"authorId" integer not null,
	"bracketUrl" text not null,
	"description" text,
	"discordInviteCode" text,
	"discordUrl" text generated always as ('https://discord.gg/' || "discordInviteCode") virtual,
	"participantCount" integer,
	"tags" text,
	"tournamentId" integer,
	"avatarImgId" integer,
	"organizationId" integer references "TournamentOrganization" ("id") on delete set null,
	"hidden" integer default 0,
	"trophyId" integer references "Trophy" ("id") on delete set null,
	foreign key ("authorId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create table "CalendarEventDate" (
	"id" integer primary key,
	"eventId" integer not null,
	"startsAt" integer not null,
	foreign key ("eventId") references "CalendarEvent" ("id") on delete cascade
) strict;
--> statement-breakpoint
create table "CalendarEventResultTeam" (
	"id" integer primary key,
	"eventId" integer not null,
	"name" text not null,
	"placement" integer not null,
	foreign key ("eventId") references "CalendarEvent" ("id") on delete cascade
) strict;
--> statement-breakpoint
create table "CalendarEventResultPlayer" (
	"teamId" integer not null,
	"userId" integer,
	"name" text,
	foreign key ("teamId") references "CalendarEventResultTeam" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create table "CalendarEventBadge" (
	"eventId" integer not null,
	"badgeId" integer not null,
	foreign key ("eventId") references "CalendarEvent" ("id") on delete cascade,
	foreign key ("badgeId") references "Badge" ("id") on delete restrict,
	unique ("eventId", "badgeId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "BuildWeapon" (
	"buildId" integer not null,
	"weaponSplId" integer not null,
	"updatedAt" integer default 1760608251,
	"sortValue" integer,
	"canonicalWeaponSplId" integer,
	foreign key ("buildId") references "Build" ("id") on delete cascade,
	unique ("buildId", "weaponSplId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index build_weapon_build_id on "BuildWeapon" ("buildId");
--> statement-breakpoint
create unique index user_custom_url_unique on "User" ("customUrl");
--> statement-breakpoint
create table "MapPoolMap" (
	"calendarEventId" integer,
	"stageId" integer not null,
	"mode" text not null,
	"tournamentTeamId" integer,
	"tieBreakerCalendarEventId" integer,
	foreign key ("calendarEventId") references "CalendarEvent" ("id") on delete cascade,
	unique ("calendarEventId", "stageId", "mode")
	on conflict rollback
) strict;
--> statement-breakpoint
create index map_pool_map_calendar_event_id on "MapPoolMap" ("calendarEventId");
--> statement-breakpoint
create table "UserResultHighlight" (
	"teamId" integer not null,
	"userId" integer not null,
	foreign key ("teamId") references "CalendarEventResultTeam" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("teamId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index user_result_highlight_user_id on "UserResultHighlight" ("userId");
--> statement-breakpoint
create index user_result_highlight_team_id on "UserResultHighlight" ("teamId");
--> statement-breakpoint
create index map_pool_map_tournament_team_id on "MapPoolMap" ("tournamentTeamId");
--> statement-breakpoint
create index map_pool_map_tie_breaker_calendar_event_id on "MapPoolMap" ("tieBreakerCalendarEventId");
--> statement-breakpoint
create table "UserWeapon" (
	"userId" integer not null,
	"weaponSplId" integer not null,
	"order" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"isFavorite" integer not null default 0,
	unique ("userId", "weaponSplId")
	on conflict rollback,
	unique ("userId", "order")
	on conflict rollback,
	foreign key ("userId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index user_weapon_user_id on "UserWeapon" ("userId");
--> statement-breakpoint
create view "UserSubmittedImage" as
select
	*
from
	"UnvalidatedUserSubmittedImage"
where
	"validatedAt" is not null;
--> statement-breakpoint
create table "AllTeam" (
	"id" integer primary key,
	"name" text not null,
	"customUrl" text not null,
	"inviteCode" text not null,
	"bio" text,
	"avatarImgId" integer,
	"bannerImgId" integer,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"deletedAt" integer,
	"bsky" text,
	"tag" text,
	"customTheme" text default null,
	"mapModePreferences" text,
	foreign key ("avatarImgId") references "UnvalidatedUserSubmittedImage" ("id") on delete set null,
	foreign key ("bannerImgId") references "UnvalidatedUserSubmittedImage" ("id") on delete set null
) strict;
--> statement-breakpoint
create index team_custom_url on "AllTeam" ("customUrl");
--> statement-breakpoint
create view "Team" as
select
	*
from
	"AllTeam"
where
	"deletedAt" is null;
--> statement-breakpoint
create table "AllTeamMember" (
	"teamId" integer not null,
	"userId" integer not null,
	"role" text,
	"isOwner" integer not null default 0,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"leftAt" integer,
	"isMainTeam" integer default 1,
	"isManager" integer default 0,
	"customRole" text,
	"roleType" text,
	"order" integer not null default 0,
	foreign key ("teamId") references "AllTeam" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("teamId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "UnvalidatedUserSubmittedImage" (
	"id" integer primary key,
	"validatedAt" integer,
	"url" text not null unique,
	"submitterUserId" integer not null,
	foreign key ("submitterUserId") references "User" ("id") on delete set null
) strict;
--> statement-breakpoint
create index submitter_user_id on "UnvalidatedUserSubmittedImage" ("submitterUserId");
--> statement-breakpoint
create table "PlusTier" (
	"userId" integer primary key,
	"tier" integer not null,
	foreign key ("userId") references "User" ("id") on delete set null
) strict;
--> statement-breakpoint
create table "UnvalidatedVideo" (
	"id" integer primary key,
	"title" text not null,
	"type" text not null,
	"youtubeId" text not null,
	"youtubePublishedAt" integer not null,
	"submitterUserId" integer not null,
	"validatedAt" integer,
	"eventId" integer,
	foreign key ("submitterUserId") references "User" ("id") on delete restrict,
	foreign key ("eventId") references "CalendarEvent" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index video_event_id on "UnvalidatedVideo" ("eventId");
--> statement-breakpoint
create view "Video" as
select
	*
from
	"UnvalidatedVideo"
where
	"validatedAt" is not null;
--> statement-breakpoint
create table "VideoMatch" (
	"id" integer primary key,
	"videoId" integer not null,
	"startsAt" integer not null,
	"stageId" integer not null,
	"mode" text not null,
	foreign key ("videoId") references "UnvalidatedVideo" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index video_match_video_id on "VideoMatch" ("videoId");
--> statement-breakpoint
create table "VideoMatchPlayer" (
	"videoMatchId" integer not null,
	"playerUserId" integer,
	"playerName" text,
	"weaponSplId" integer not null,
	"player" integer not null,
	foreign key ("videoMatchId") references "VideoMatch" ("id") on delete cascade,
	foreign key ("playerUserId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index video_match_player_video_match_id on "VideoMatchPlayer" ("videoMatchId");
--> statement-breakpoint
create index video_match_player_player_user_id on "VideoMatchPlayer" ("playerUserId");
--> statement-breakpoint
create table "XRankPlacement" (
	"id" integer primary key,
	"weaponSplId" integer not null,
	"name" text not null,
	"nameDiscriminator" text not null,
	"power" real not null,
	"rank" integer not null,
	"title" text not null,
	"badges" text not null,
	"bannerSplId" integer not null,
	"playerId" integer not null,
	"month" integer not null,
	"year" integer not null,
	"mode" text not null,
	"region" text not null,
	foreign key ("playerId") references "SplatoonPlayer" ("id") on delete cascade,
	unique ("rank", "month", "year", "region", "mode")
	on conflict rollback
) strict;
--> statement-breakpoint
create index splatoon_placement_player_id on "XRankPlacement" ("playerId");
--> statement-breakpoint
create index calendar_event_tournament_id on "CalendarEvent" ("tournamentId");
--> statement-breakpoint
create table "Tournament" (
	"id" integer primary key,
	"mapPickingStyle" text not null,
	"castTwitchAccounts" text,
	"settings" text not null default '{"bracketProgression":[{"type":"double_elimination","name":"Main bracket"}]}',
	"castedMatchesInfo" text,
	"rules" text,
	"preparedMaps" text,
	"parentTournamentId" integer references "Tournament" ("id") on delete restrict,
	"isFinalized" integer not null default 0,
	"seedingSnapshot" text default null,
	"tier" integer,
	"vodsLastSyncAt" integer,
	"vodsSyncCount" integer not null default 0
) strict;
--> statement-breakpoint
create table "TournamentTeam" (
	"id" integer primary key,
	"name" text not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"seed" integer,
	"inviteCode" text not null unique,
	"tournamentId" integer not null,
	"prefersNotToHost" integer not null default 0,
	"teamId" integer,
	"droppedOut" integer default 0,
	"activeRosterUserIds" text,
	"avatarImgId" integer,
	"startingBracketIdx" integer,
	"isLooking" integer not null default 0,
	"isPlaceholder" integer not null default 0,
	"lfgNote" text,
	"chatCode" text,
	"abDivision" integer,
	"tournamentTeamHistoryId" integer references "TournamentTeamHistory" ("id"),
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade,
	unique ("tournamentId", "name")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_team_tournament_id on "TournamentTeam" ("tournamentId");
--> statement-breakpoint
create table "TournamentTeamCheckIn" (
	"tournamentTeamId" integer not null,
	"checkedInAt" integer not null,
	"bracketIdx" integer,
	"isCheckOut" integer default 0,
	foreign key ("tournamentTeamId") references "TournamentTeam" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index tournament_team_check_in_tournament_team_id on "TournamentTeamCheckIn" ("tournamentTeamId");
--> statement-breakpoint
create table "TournamentTeamMember" (
	"tournamentTeamId" integer not null,
	"userId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"inGameName" text,
	"role" text not null default 'REGULAR',
	"isStayAsSub" integer not null default 0,
	"isLooking" integer not null default 0,
	"isSub" integer not null default 0,
	foreign key ("tournamentTeamId") references "TournamentTeam" ("id") on delete cascade,
	unique ("tournamentTeamId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_team_member_tournament_team_id on "TournamentTeamMember" ("tournamentTeamId");
--> statement-breakpoint
create table "TournamentGroup" (
	"id" integer primary key,
	"stageId" integer not null,
	"number" integer not null,
	foreign key ("stageId") references "TournamentStage" ("id") on delete cascade,
	unique ("number", "stageId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_group_stage_id on "TournamentGroup" ("stageId");
--> statement-breakpoint
create table "TournamentRound" (
	"id" integer primary key,
	"stageId" integer not null,
	"groupId" integer not null,
	"number" integer not null,
	"maps" text,
	foreign key ("stageId") references "TournamentStage" ("id") on delete cascade,
	foreign key ("groupId") references "TournamentGroup" ("id") on delete cascade,
	unique ("number", "groupId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_round_stage_id on "TournamentRound" ("stageId");
--> statement-breakpoint
create index tournament_round_group_id on "TournamentRound" ("groupId");
--> statement-breakpoint
create table "TournamentMatchGameResult" (
	"id" integer primary key,
	"matchId" integer not null,
	"number" integer not null,
	"stageId" integer not null,
	"mode" text not null,
	"source" text not null,
	"winnerTeamId" integer not null,
	"reporterId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"ko" integer,
	foreign key ("matchId") references "TournamentMatch" ("id") on delete cascade,
	foreign key ("winnerTeamId") references "TournamentTeam" ("id") on delete restrict,
	foreign key ("reporterId") references "User" ("id") on delete restrict,
	unique ("matchId", "number")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_match_game_result_match_id on "TournamentMatchGameResult" ("matchId");
--> statement-breakpoint
create index tournament_match_game_result_winner_team_id on "TournamentMatchGameResult" ("winnerTeamId");
--> statement-breakpoint
create table "TournamentMatchGameResultParticipant" (
	"matchGameResultId" integer not null,
	"userId" integer not null,
	"tournamentTeamId" integer,
	foreign key ("matchGameResultId") references "TournamentMatchGameResult" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("matchGameResultId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_match_game_result_participant_match_game_result_id on "TournamentMatchGameResultParticipant" ("matchGameResultId");
--> statement-breakpoint
create index tournament_match_game_result_participant_user_id on "TournamentMatchGameResultParticipant" ("userId");
--> statement-breakpoint
create table "TrustRelationship" (
	"trustGiverUserId" integer not null,
	"trustReceiverUserId" integer not null,
	"lastUsedAt" integer default 0,
	foreign key ("trustGiverUserId") references "User" ("id") on delete cascade,
	foreign key ("trustReceiverUserId") references "User" ("id") on delete cascade,
	unique ("trustGiverUserId", "trustReceiverUserId")
	on conflict ignore
) strict;
--> statement-breakpoint
create index trust_relationship_trust_giver_user_id on "TrustRelationship" ("trustGiverUserId");
--> statement-breakpoint
create index trust_relationship_trust_receiver_user_id on "TrustRelationship" ("trustReceiverUserId");
--> statement-breakpoint
create table "Skill" (
	"id" integer primary key,
	"mu" real not null,
	"sigma" real not null,
	"ordinal" real not null,
	"userId" integer,
	"identifier" text,
	"matchesCount" integer not null,
	"tournamentId" integer,
	"groupMatchId" integer,
	"season" integer not null,
	"createdAt" integer,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("tournamentId") references "Tournament" ("id") on delete restrict,
	unique ("userId", "tournamentId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index skill_user_id on "Skill" ("userId");
--> statement-breakpoint
create index skill_tournament_id on "Skill" ("tournamentId");
--> statement-breakpoint
create table "SkillTeamUser" (
	"userId" integer not null,
	"skillId" integer not null,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("skillId") references "Skill" ("id") on delete cascade,
	unique ("userId", "skillId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index skill_team_user_user_id on "SkillTeamUser" ("userId");
--> statement-breakpoint
create index skill_team_user_skill_id on "SkillTeamUser" ("skillId");
--> statement-breakpoint
create table "TournamentResult" (
	"tournamentId" integer not null,
	"userId" integer not null,
	"placement" integer not null,
	"isHighlight" integer not null default 0,
	"participantCount" integer not null,
	"tournamentTeamId" integer not null,
	"setResults" text not null default '[]',
	"spDiff" real,
	"div" text,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade,
	foreign key ("tournamentTeamId") references "TournamentTeam" ("id") on delete cascade,
	unique ("userId", "tournamentId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_result_user_id on "TournamentResult" ("userId");
--> statement-breakpoint
create index tournament_result_tournament_id on "TournamentResult" ("tournamentId");
--> statement-breakpoint
create table "Art" (
	"id" integer primary key,
	"imgId" integer not null,
	"authorId" integer not null,
	"isShowcase" integer not null default 0,
	"description" text,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("authorId") references "User" ("id") on delete restrict,
	foreign key ("imgId") references "UnvalidatedUserSubmittedImage" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index art_author_id on "Art" ("authorId");
--> statement-breakpoint
create index art_img_id on "Art" ("imgId");
--> statement-breakpoint
create table "ArtUserMetadata" (
	"artId" integer not null,
	"userId" integer not null,
	foreign key ("artId") references "Art" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index art_user_metadata_art_id on "ArtUserMetadata" ("artId");
--> statement-breakpoint
create index art_user_metadata_user_id on "ArtUserMetadata" ("userId");
--> statement-breakpoint
create table "ArtTag" (
	"id" integer primary key,
	"name" text unique not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"authorId" integer not null,
	foreign key ("authorId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create table "TaggedArt" (
	"artId" integer not null,
	"tagId" integer not null,
	foreign key ("artId") references "Art" ("id") on delete cascade,
	foreign key ("tagId") references "ArtTag" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index tagged_art_art_id on "TaggedArt" ("artId");
--> statement-breakpoint
create index tagged_art_tag_id on "TaggedArt" ("tagId");
--> statement-breakpoint
create index skill_identifier on "Skill" ("identifier");
--> statement-breakpoint
create index skill_group_match_id on "Skill" ("groupMatchId");
--> statement-breakpoint
create table "MapResult" (
	"mode" text not null,
	"stageId" integer not null,
	"userId" integer not null,
	"wins" integer not null,
	"losses" integer not null,
	"season" integer not null,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("userId", "stageId", "mode", "season")
	on conflict rollback
) strict;
--> statement-breakpoint
create index map_result_user_id on "MapResult" ("userId");
--> statement-breakpoint
create table "PlayerResult" (
	"ownerUserId" integer not null,
	"otherUserId" integer not null,
	"mapWins" integer not null,
	"mapLosses" integer not null,
	"setWins" integer not null,
	"setLosses" integer not null,
	"type" text not null,
	"season" integer not null,
	foreign key ("ownerUserId") references "User" ("id") on delete cascade,
	foreign key ("otherUserId") references "User" ("id") on delete cascade,
	unique ("ownerUserId", "otherUserId", "type", "season")
	on conflict rollback
) strict;
--> statement-breakpoint
create index player_result_owner_user_id on "PlayerResult" ("ownerUserId");
--> statement-breakpoint
create index player_result_other_user_id on "PlayerResult" ("otherUserId");
--> statement-breakpoint
create table "Group" (
	"id" integer primary key,
	"teamId" integer,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"latestActionAt" integer default (strftime('%s', 'now')) not null,
	"inviteCode" text not null,
	"status" text not null,
	"chatCode" text,
	"matchmade" integer default 0 not null,
	foreign key ("teamId") references "AllTeam" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index group_team_id on "Group" ("teamId");
--> statement-breakpoint
create table "GroupMember" (
	"groupId" integer not null,
	"userId" integer not null,
	"role" text not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"note" text,
	foreign key ("userId") references "User" ("id") on delete restrict,
	foreign key ("groupId") references "Group" ("id") on delete cascade,
	unique ("userId", "groupId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index group_member_group_id on "GroupMember" ("groupId");
--> statement-breakpoint
create index group_member_user_id on "GroupMember" ("userId");
--> statement-breakpoint
create table "GroupLike" (
	"likerGroupId" integer not null,
	"targetGroupId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"isRechallenge" integer not null default 0,
	foreign key ("likerGroupId") references "Group" ("id") on delete cascade,
	foreign key ("targetGroupId") references "Group" ("id") on delete cascade,
	unique ("likerGroupId", "targetGroupId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index group_like_liker_group_id on "GroupLike" ("likerGroupId");
--> statement-breakpoint
create index group_like_target_group_id on "GroupLike" ("targetGroupId");
--> statement-breakpoint
create table "GroupMatchMap" (
	"id" integer primary key,
	"matchId" integer not null,
	"index" integer not null,
	"mode" text not null,
	"stageId" integer not null,
	"source" text not null,
	"winnerGroupId" integer,
	"reportedAt" integer,
	"reportedByUserId" integer references "User" ("id"),
	foreign key ("matchId") references "GroupMatch" ("id") on delete cascade,
	foreign key ("winnerGroupId") references "Group" ("id") on delete restrict,
	unique ("matchId", "index")
	on conflict rollback
) strict;
--> statement-breakpoint
create index group_match_map_match_id on "GroupMatchMap" ("matchId");
--> statement-breakpoint
create index group_match_map_winner_group_id on "GroupMatchMap" ("winnerGroupId");
--> statement-breakpoint
create table "LogInLink" (
	"code" text unique not null,
	"expiresAt" integer not null,
	"userId" integer not null,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index user_patron_tier on "User" ("patronTier");
--> statement-breakpoint
create index calendar_event_result_player_user_id on "CalendarEventResultPlayer" ("userId");
--> statement-breakpoint
create index calendar_event_result_player_team_id on "CalendarEventResultPlayer" ("teamId");
--> statement-breakpoint
create table "PrivateUserNote" (
	"authorId" integer not null,
	"targetId" integer not null,
	"text" text,
	"sentiment" text not null,
	"updatedAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("authorId") references "User" ("id") on delete cascade,
	foreign key ("targetId") references "User" ("id") on delete cascade,
	unique ("authorId", "targetId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "TournamentStaff" (
	"tournamentId" integer not null,
	"userId" integer not null,
	"role" text not null,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("tournamentId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "UserFriendCode" (
	"friendCode" text not null,
	"userId" integer not null,
	"submitterUserId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("submitterUserId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index skill_season on "Skill" ("season");
--> statement-breakpoint
create table "LFGPost" (
	"id" integer primary key,
	"type" text not null,
	"text" text not null,
	"timezone" text not null,
	"authorId" integer not null,
	"teamId" integer,
	"plusTierVisibility" integer,
	"updatedAt" integer default (strftime('%s', 'now')) not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"languages" text,
	foreign key ("authorId") references "User" ("id") on delete restrict,
	foreign key ("teamId") references "AllTeam" ("id") on delete cascade,
	unique ("authorId", "type")
	on conflict rollback
) strict;
--> statement-breakpoint
create index lfg_post_author_id on "LFGPost" ("authorId");
--> statement-breakpoint
create index lfg_post_team_id on "LFGPost" ("teamId");
--> statement-breakpoint
create index skill_user_id_season on "Skill" ("userId", "season");
--> statement-breakpoint
create index user_friend_code_user_id on "UserFriendCode" ("userId");
--> statement-breakpoint
create table "TournamentOrganization" (
	"id" integer primary key,
	"name" text not null,
	"slug" text unique not null,
	"description" text,
	"socials" text,
	"avatarImgId" integer,
	"isEstablished" integer not null default 0,
	foreign key ("avatarImgId") references "UnvalidatedUserSubmittedImage" ("id") on delete set null
) strict;
--> statement-breakpoint
create index tournament_organization_slug on "TournamentOrganization" ("slug");
--> statement-breakpoint
create table "TournamentOrganizationMember" (
	"organizationId" integer not null,
	"userId" integer not null,
	"role" text not null,
	"roleDisplayName" text,
	foreign key ("organizationId") references "TournamentOrganization" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("organizationId", "userId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "TournamentOrganizationBadge" (
	"organizationId" integer not null,
	"badgeId" integer not null,
	foreign key ("organizationId") references "TournamentOrganization" ("id") on delete cascade,
	foreign key ("badgeId") references "Badge" ("id") on delete cascade,
	unique ("organizationId", "badgeId")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "TournamentOrganizationSeries" (
	"id" integer primary key,
	"organizationId" integer not null,
	"name" text not null,
	"description" text,
	"substringMatches" text not null,
	"showLeaderboard" integer not null default 0,
	"tierHistory" text,
	foreign key ("organizationId") references "TournamentOrganization" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index tournament_organization_series_organization_id on "TournamentOrganizationSeries" ("organizationId");
--> statement-breakpoint
create index calendar_event_organization_id on "CalendarEvent" ("organizationId");
--> statement-breakpoint
create index tournament_result_tournament_team_id on "TournamentResult" ("tournamentTeamId");
--> statement-breakpoint
create view "TeamMember" as
select
	"AllTeamMember".*
from
	"AllTeamMember"
	left join "Team" on "Team"."id" = "AllTeamMember"."teamId"
where
	"AllTeamMember"."leftAt" is null
	and
	-- if team id is null the team is deleted
	"Team"."id" is not null
	and "AllTeamMember"."isMainTeam" = 1;
--> statement-breakpoint
create view "TeamMemberWithSecondary" as
select
	"AllTeamMember".*
from
	"AllTeamMember"
	left join "Team" on "Team"."id" = "AllTeamMember"."teamId"
where
	"AllTeamMember"."leftAt" is null
	and
	-- if team id is null the team is deleted
	"Team"."id" is not null;
--> statement-breakpoint
create index badge_author_id on "Badge" ("authorId");
--> statement-breakpoint
create table "SeedingSkill" (
	"mu" real not null,
	"sigma" real not null,
	"ordinal" real not null,
	"userId" integer not null,
	"type" text not null,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("userId", "type")
	on conflict replace
) strict;
--> statement-breakpoint
create table "TournamentBracketProgressionOverride" (
	"sourceBracketIdx" integer not null,
	"destinationBracketIdx" integer not null,
	"tournamentTeamId" integer not null,
	"tournamentId" integer not null,
	unique ("sourceBracketIdx", "tournamentTeamId")
	on conflict replace,
	foreign key ("tournamentTeamId") references "TournamentTeam" ("id") on delete cascade,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index tournament_bracket_progression_override_tournament_id on "TournamentBracketProgressionOverride" ("tournamentId");
--> statement-breakpoint
create table "Notification" (
	"id" integer primary key,
	"type" text not null,
	"meta" text,
	"pictureUrl" text,
	"createdAt" integer default (strftime('%s', 'now')) not null
) strict;
--> statement-breakpoint
create index notification_type on "Notification" ("type");
--> statement-breakpoint
create table "NotificationUser" (
	"notificationId" integer not null,
	"userId" integer not null,
	"seen" integer default 0 not null,
	unique ("notificationId", "userId"),
	foreign key ("notificationId") references "Notification" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index notification_user_id on "NotificationUser" ("userId");
--> statement-breakpoint
create table "NotificationUserSubscription" (
	"id" integer primary key,
	"userId" integer not null,
	"subscription" text not null,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index notification_push_url_user_id on "NotificationUserSubscription" ("userId");
--> statement-breakpoint
create table "ScrimPost" (
	"id" integer primary key,
	"startsAt" integer not null,
	"maxDiv" integer,
	"minDiv" integer,
	"visibility" text,
	"text" text,
	"chatCode" text not null,
	"teamId" integer,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"updatedAt" integer default (strftime('%s', 'now')) not null,
	"managedByAnyone" integer default 0 not null,
	"canceledAt" integer,
	"canceledByUserId" integer references "User" ("id") on delete restrict,
	"cancelReason" text,
	"isScheduledForFuture" integer default 1,
	"rangeEndsAt" integer,
	"maps" text,
	"mapsTournamentId" integer references "Tournament" ("id") on delete cascade,
	foreign key ("teamId") references "AllTeam" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index scrim_post_team_id on "ScrimPost" ("teamId");
--> statement-breakpoint
create table "ScrimPostUser" (
	"scrimPostId" integer not null,
	"userId" integer not null,
	"isOwner" integer not null,
	unique ("scrimPostId", "userId")
	on conflict rollback,
	foreign key ("scrimPostId") references "ScrimPost" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create table "ScrimPostRequest" (
	"id" integer primary key,
	"scrimPostId" integer not null,
	"teamId" integer,
	"isAccepted" integer default 0 not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"message" text,
	"startsAt" integer,
	unique ("scrimPostId", "teamId")
	on conflict rollback,
	foreign key ("scrimPostId") references "ScrimPost" ("id") on delete cascade,
	foreign key ("teamId") references "AllTeam" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index scrim_post_request_scrim_post_id on "ScrimPostRequest" ("scrimPostId");
--> statement-breakpoint
create index scrim_post_request_team_id on "ScrimPostRequest" ("teamId");
--> statement-breakpoint
create table "ScrimPostRequestUser" (
	"scrimPostRequestId" integer not null,
	"userId" integer not null,
	"isOwner" integer not null,
	unique ("scrimPostRequestId", "userId")
	on conflict rollback,
	foreign key ("scrimPostRequestId") references "ScrimPostRequest" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index scrim_post_request_user_scrim_post_request_id on "ScrimPostRequestUser" ("scrimPostRequestId");
--> statement-breakpoint
create index scrim_post_request_user_user_id on "ScrimPostRequestUser" ("userId");
--> statement-breakpoint
create table "Association" (
	"id" integer primary key,
	"name" text not null,
	"inviteCode" text not null unique,
	"createdAt" integer default (strftime('%s', 'now')) not null
) strict;
--> statement-breakpoint
create table "AssociationMember" (
	"userId" integer not null,
	"associationId" integer not null,
	"role" text not null,
	unique ("userId", "associationId")
	on conflict rollback,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("associationId") references "Association" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index association_member_user_id on "AssociationMember" ("userId");
--> statement-breakpoint
create index association_member_association_id on "AssociationMember" ("associationId");
--> statement-breakpoint
create table "BanLog" (
	"id" integer primary key,
	"userId" integer not null,
	"banned" integer,
	"bannedReason" text,
	"bannedByUserId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("userId") references "User" ("id") on delete restrict,
	foreign key ("bannedByUserId") references "User" ("id") on delete restrict
);
--> statement-breakpoint
create index ban_log_user_id on "BanLog" ("userId");
--> statement-breakpoint
create table "ModNote" (
	"id" integer primary key,
	"userId" integer not null,
	"authorId" integer not null,
	"text" text not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"isDeleted" integer not null default 0,
	foreign key ("userId") references "User" ("id") on delete restrict,
	foreign key ("authorId") references "User" ("id") on delete restrict
);
--> statement-breakpoint
create index mod_note_user_id on "ModNote" ("userId");
--> statement-breakpoint
create table "TournamentOrganizationBannedUser" (
	"organizationId" integer not null references "TournamentOrganization" ("id") on delete cascade,
	"userId" integer not null references "User" ("id") on delete restrict,
	"privateNote" text,
	"updatedAt" integer default (strftime('%s', 'now')) not null,
	"expiresAt" integer,
	unique ("organizationId", "userId")
	on conflict replace
);
--> statement-breakpoint
create index tournament_team_team_id on "TournamentTeam" ("teamId");
--> statement-breakpoint
create unique index badge_owner_tournament_user_unique on "TournamentBadgeOwner" ("tournamentId", "userId");
--> statement-breakpoint
create index idx_tmgrp_tournament_team_id on "TournamentMatchGameResultParticipant" ("tournamentTeamId");
--> statement-breakpoint
create index "scrim_post_maps_tournament_id" on "ScrimPost" ("mapsTournamentId");
--> statement-breakpoint
create index map_result_user_id_season on "MapResult" ("userId", "season");
--> statement-breakpoint
create index player_result_owner_user_id_season on "PlayerResult" ("ownerUserId", "season");
--> statement-breakpoint
create table "LiveStream" (
	"id" integer primary key,
	"userId" integer unique,
	"viewerCount" integer not null,
	"thumbnailUrl" text not null,
	"twitch" text,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index user_twitch on "User" ("twitch");
--> statement-breakpoint
create index livestream_twitch on "LiveStream" ("twitch");
--> statement-breakpoint
create table "ApiToken" (
	"id" integer primary key,
	"token" text not null unique,
	"userId" integer not null,
	"type" text not null default 'read',
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create unique index [REDACTED]on "ApiToken" ("userId", "type");
--> statement-breakpoint
create table "UserWidget" (
	"userId" integer not null,
	"index" integer not null,
	"widget" text not null,
	primary key ("userId", "index"),
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index user_widget_user_id on "UserWidget" ("userId");
--> statement-breakpoint
create table "Friendship" (
	"id" integer primary key,
	"userOneId" integer not null,
	"userTwoId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	unique ("userOneId", "userTwoId")
	on conflict rollback,
	foreign key ("userOneId") references "User" ("id") on delete cascade,
	foreign key ("userTwoId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index friendship_user_one_id on "Friendship" ("userOneId");
--> statement-breakpoint
create index friendship_user_two_id on "Friendship" ("userTwoId");
--> statement-breakpoint
create table "FriendRequest" (
	"id" integer primary key,
	"senderId" integer not null,
	"receiverId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	unique ("senderId", "receiverId")
	on conflict rollback,
	foreign key ("senderId") references "User" ("id") on delete cascade,
	foreign key ("receiverId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index friend_request_receiver_id on "FriendRequest" ("receiverId");
--> statement-breakpoint
create index all_team_member_user_id on "AllTeamMember" ("userId");
--> statement-breakpoint
create table "SavedCalendarEvent" (
	"id" integer primary key,
	"userId" integer not null,
	"calendarEventId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	unique ("userId", "calendarEventId")
	on conflict rollback,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("calendarEventId") references "CalendarEvent" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index saved_calendar_event_user_id on "SavedCalendarEvent" ("userId");
--> statement-breakpoint
create index saved_calendar_event_calendar_event_id on "SavedCalendarEvent" ("calendarEventId");
--> statement-breakpoint
create table "SplatoonRotation" (
	"id" integer primary key,
	"type" text not null,
	"mode" text not null,
	"stageId1" integer not null,
	"stageId2" integer not null,
	"startsAt" integer not null,
	"endsAt" integer not null
) strict;
--> statement-breakpoint
create index tournament_team_member_user_id_is_looking on "TournamentTeamMember" ("userId", "isLooking");
--> statement-breakpoint
create trigger sync_is_looking_on_team_update after
update of isLooking on "TournamentTeam" begin
update "TournamentTeamMember"
set
	"isLooking" = NEW."isLooking"
where
	"tournamentTeamId" = NEW."id";

end;
--> statement-breakpoint
create trigger sync_is_looking_on_member_insert after insert on "TournamentTeamMember" begin
update "TournamentTeamMember"
set
	"isLooking" = (
		select
			"isLooking"
		from
			"TournamentTeam"
		where
			"id" = NEW."tournamentTeamId"
	)
where
	rowid = NEW.rowid;

end;
--> statement-breakpoint
create table "TournamentLFGLike" (
	"likerTeamId" integer not null,
	"targetTeamId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("likerTeamId") references "TournamentTeam" ("id") on delete cascade,
	foreign key ("targetTeamId") references "TournamentTeam" ("id") on delete cascade,
	unique ("likerTeamId", "targetTeamId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_lfg_like_liker_team_id on "TournamentLFGLike" ("likerTeamId");
--> statement-breakpoint
create index tournament_lfg_like_target_team_id on "TournamentLFGLike" ("targetTeamId");
--> statement-breakpoint
create table "TournamentStreamer" (
	"id" integer primary key autoincrement,
	"userId" integer,
	"tournamentId" integer not null,
	"twitchAccount" text not null,
	unique ("twitchAccount", "tournamentId")
	on conflict ignore
) strict;
--> statement-breakpoint
create table "TournamentMatchPickBanEvent" (
	"type" text not null,
	"stageId" integer,
	"mode" text,
	"matchId" integer not null,
	"authorId" integer,
	"number" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("authorId") references "User" ("id") on delete restrict,
	foreign key ("matchId") references "TournamentMatch" ("id") on delete cascade,
	unique ("matchId", "number")
	on conflict rollback
) strict;
--> statement-breakpoint
create index pick_ban_event_author_id on "TournamentMatchPickBanEvent" ("authorId");
--> statement-breakpoint
create index pick_ban_event_match_id on "TournamentMatchPickBanEvent" ("matchId");
--> statement-breakpoint
create table "TournamentMatchVod" (
	"id" integer primary key autoincrement,
	"matchId" integer not null references "TournamentMatch" ("id"),
	"userId" integer references "User" ("id"),
	"platform" text not null,
	"account" text not null,
	"platformVideoId" text not null,
	"timestampSeconds" integer not null,
	"viewCount" integer not null
) strict;
--> statement-breakpoint
create unique index "tournament_match_vod_match_id_account" on "TournamentMatchVod" ("matchId", "account");
--> statement-breakpoint
create table "Build" (
	"id" integer primary key,
	"ownerId" integer not null,
	"title" text not null,
	"description" text,
	"modes" text,
	"headGearSplId" integer,
	"clothesGearSplId" integer,
	"shoesGearSplId" integer,
	"updatedAt" integer default (strftime('%s', 'now')) not null,
	"abilities" text,
	"abilitiesSignature" text,
	"isPrivate" integer not null default 0,
	foreign key ("ownerId") references "User" ("id") on delete restrict
) strict;
--> statement-breakpoint
create index build_owner_id on "Build" ("ownerId");
--> statement-breakpoint
create unique index "tournament_team_check_in_team_bracket_unique" on "TournamentTeamCheckIn" ("tournamentTeamId", coalesce("bracketIdx", -1));
--> statement-breakpoint
create table "GroupMatch" (
	"id" integer primary key,
	"alphaGroupId" integer not null,
	"bravoGroupId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"chatCode" text,
	"memento" text,
	"confirmedAt" integer,
	"confirmedByUserId" integer references "User" ("id"),
	"cancelRequestedByUserId" integer references "User" ("id"),
	"cancelAcceptedByUserId" integer references "User" ("id"),
	"noScreen" integer default 0 not null,
	foreign key ("alphaGroupId") references "Group" ("id") on delete restrict,
	foreign key ("bravoGroupId") references "Group" ("id") on delete restrict,
	unique ("alphaGroupId")
	on conflict rollback,
	unique ("bravoGroupId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index group_match_alpha_group_id on "GroupMatch" ("alphaGroupId");
--> statement-breakpoint
create index group_match_bravo_group_id on "GroupMatch" ("bravoGroupId");
--> statement-breakpoint
create index group_match_created_at on "GroupMatch" ("createdAt");
--> statement-breakpoint
create index group_match_confirmed_at on "GroupMatch" ("confirmedAt");
--> statement-breakpoint
create index group_match_map_reported_at on "GroupMatchMap" ("reportedAt");
--> statement-breakpoint
create table "GroupMatchContinueVote" (
	"id" integer primary key,
	"groupId" integer not null,
	"userId" integer not null,
	"isContinuing" integer not null check ("isContinuing" in (0, 1)),
	"votedAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("groupId") references "Group" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("groupId", "userId")
) strict;
--> statement-breakpoint
create index group_match_continue_vote_group_id on "GroupMatchContinueVote" ("groupId");
--> statement-breakpoint
create view "PlusVotingResult" as
select
	"votedId",
	"tier",
	avg("score") as "score",
	"month",
	"year",
	exists (
		select
			1
		from
			"PlusSuggestion"
		where
			"PlusSuggestion"."month" = "PlusVote"."month"
			and "PlusSuggestion"."year" = "PlusVote"."year"
			and "PlusSuggestion"."suggestedId" = "PlusVote"."votedId"
			and "PlusSuggestion"."tier" = "PlusVote"."tier"
	) as "wasSuggested"
from
	"PlusVote"
group by
	"votedId",
	"tier",
	"month",
	"year";
--> statement-breakpoint
create view "BadgeOwner" as
select
	"userId",
	"badgeId",
	"count"
from
	"TournamentBadgeOwner"
union all
select
	"id" as "userId",
	case
		when "patronTier" = 2 then 40
		else 41
	end as "badgeId",
	1 as "count"
from
	"User"
where
	"patronTier" > 1;
--> statement-breakpoint
create index tournament_badge_owner_user_id on "TournamentBadgeOwner" ("userId");
--> statement-breakpoint
create table "ReportedWeapon" (
	"groupMatchId" integer,
	"tournamentMatchId" integer,
	"mapIndex" integer not null,
	"weaponSplId" integer not null,
	"userId" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("groupMatchId") references "GroupMatch" ("id") on delete cascade,
	foreign key ("tournamentMatchId") references "TournamentMatch" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete restrict,
	unique ("groupMatchId", "mapIndex", "userId")
	on conflict rollback,
	unique ("tournamentMatchId", "mapIndex", "userId")
	on conflict rollback,
	check (
		("groupMatchId" is not null) <> ("tournamentMatchId" is not null)
	)
) strict;
--> statement-breakpoint
create index reported_weapon_group_match_id on "ReportedWeapon" ("groupMatchId");
--> statement-breakpoint
create index reported_weapon_tournament_match_id on "ReportedWeapon" ("tournamentMatchId");
--> statement-breakpoint
create index reported_weapon_user_id on "ReportedWeapon" ("userId");
--> statement-breakpoint
create index reported_weapon_user_created_at_weapon on "ReportedWeapon" ("userId", "createdAt", "weaponSplId");
--> statement-breakpoint
create table "BuildAbilitySum" (
	"buildId" integer not null,
	"ability" text not null,
	"abilityPoints" integer not null,
	foreign key ("buildId") references "Build" ("id") on delete cascade,
	unique ("buildId", "ability")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "BuildWeaponAbility" (
	"canonicalWeaponSplId" integer not null,
	"buildId" integer not null,
	"ability" text not null,
	"abilityPoints" integer not null,
	foreign key ("buildId") references "Build" ("id") on delete cascade,
	unique ("canonicalWeaponSplId", "buildId", "ability")
	on conflict rollback
) strict;
--> statement-breakpoint
create index build_ability_sum_ability_ap on "BuildAbilitySum" ("ability", "abilityPoints");
--> statement-breakpoint
create index build_weapon_ability_weapon_ability_ap on "BuildWeaponAbility" (
	"canonicalWeaponSplId",
	"ability",
	"abilityPoints"
);
--> statement-breakpoint
create index build_abilities_signature on "Build" ("abilitiesSignature");
--> statement-breakpoint
create unique index build_weapon_canonical_unique on "BuildWeapon" ("buildId", "canonicalWeaponSplId");
--> statement-breakpoint
create index build_weapon_lookup on "BuildWeapon" (
	"canonicalWeaponSplId",
	"sortValue",
	"updatedAt" desc,
	"buildId"
);
--> statement-breakpoint
create table "ScrimMapList" (
	"id" integer primary key autoincrement,
	"scrimPostId" integer not null,
	"side" text not null check ("side" in ('ALPHA', 'BRAVO')),
	"source" text not null check ("source" in ('TOURNAMENT', 'POOL')),
	"tournamentId" integer,
	"serializedPool" text,
	"updatedAt" integer not null,
	foreign key ("scrimPostId") references "ScrimPost" ("id") on delete cascade,
	foreign key ("tournamentId") references "Tournament" ("id"),
	unique ("scrimPostId", "side")
	on conflict rollback
) strict;
--> statement-breakpoint
create table "ScrimMap" (
	"id" integer primary key autoincrement,
	"scrimPostId" integer not null,
	"index" integer not null,
	"mode" text not null,
	"stageId" integer not null,
	"winnerSide" text check ("winnerSide" in ('ALPHA', 'BRAVO')),
	"reportedAt" integer,
	"reportedByUserId" integer,
	foreign key ("scrimPostId") references "ScrimPost" ("id") on delete cascade,
	foreign key ("reportedByUserId") references "User" ("id"),
	unique ("scrimPostId", "index")
	on conflict rollback
) strict;
--> statement-breakpoint
create index scrim_map_scrim_post_id_index_idx on "ScrimMap" ("scrimPostId", "index");
--> statement-breakpoint
create table "UserWeaponPool" (
	"userId" integer not null,
	"sortOrder" integer not null,
	"weaponSplId" integer not null,
	"isFavorite" integer not null default 0,
	foreign key ("userId") references "User" ("id") on delete cascade,
	primary key ("userId", "sortOrder")
) strict;
--> statement-breakpoint
create table "TenStarWeapon" (
	"userId" integer not null,
	"weaponSplId" integer not null,
	foreign key ("userId") references "User" ("id") on delete cascade,
	primary key ("userId", "weaponSplId")
) strict;
--> statement-breakpoint
create index xrank_placement_player_power on "XRankPlacement" (
	"playerId",
	"power",
	"mode",
	"weaponSplId",
	"name"
);
--> statement-breakpoint
create index tournament_badge_owner_badge_id on "TournamentBadgeOwner" ("badgeId");
--> statement-breakpoint
create virtual table "UserSearch" using fts5 (
	"username",
	"inGameName",
	"discordUniqueName",
	"customUrl",
	content = 'User',
	content_rowid = 'id',
	tokenize = 'trigram'
);
--> statement-breakpoint
create trigger "user_search_after_insert" after insert on "User" begin
insert into
	"UserSearch" (
		rowid,
		"username",
		"inGameName",
		"discordUniqueName",
		"customUrl"
	)
values
	(
		new."id",
		new."username",
		new."inGameName",
		new."discordUniqueName",
		new."customUrl"
	);

end;
--> statement-breakpoint
create trigger "user_search_after_delete" after delete on "User" begin
insert into
	"UserSearch" (
		"UserSearch",
		rowid,
		"username",
		"inGameName",
		"discordUniqueName",
		"customUrl"
	)
values
	(
		'delete',
		old."id",
		old."username",
		old."inGameName",
		old."discordUniqueName",
		old."customUrl"
	);

end;
--> statement-breakpoint
create trigger "user_search_after_update" after
update of "customName",
"discordName",
"inGameName",
"discordUniqueName",
"customUrl" on "User" begin
insert into
	"UserSearch" (
		"UserSearch",
		rowid,
		"username",
		"inGameName",
		"discordUniqueName",
		"customUrl"
	)
values
	(
		'delete',
		old."id",
		old."username",
		old."inGameName",
		old."discordUniqueName",
		old."customUrl"
	);

insert into
	"UserSearch" (
		rowid,
		"username",
		"inGameName",
		"discordUniqueName",
		"customUrl"
	)
values
	(
		new."id",
		new."username",
		new."inGameName",
		new."discordUniqueName",
		new."customUrl"
	);

end;
--> statement-breakpoint
create table "TournamentTeamHistory" (
	"id" integer primary key autoincrement,
	"tournamentTeamId" integer not null,
	"tournamentId" integer not null,
	"name" text not null,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index tournament_team_history_tournament_id_idx on "TournamentTeamHistory" ("tournamentId");
--> statement-breakpoint
create table "ExternalStream" (
	"id" integer primary key autoincrement,
	"name" text not null,
	"url" text not null,
	"avatarImgId" integer,
	"startsAt" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("avatarImgId") references "UnvalidatedUserSubmittedImage" ("id") on delete set null
) strict;
--> statement-breakpoint
create table "SplatoonPlayer" (
	"id" integer primary key,
	"userId" integer unique,
	"splId" text unique not null,
	"peakXp" text,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create index splatoon_player_user_id on "SplatoonPlayer" ("userId");
--> statement-breakpoint
create index all_team_avatar_img_id on "AllTeam" ("avatarImgId");
--> statement-breakpoint
create index all_team_banner_img_id on "AllTeam" ("bannerImgId");
--> statement-breakpoint
create index calendar_event_avatar_img_id on "CalendarEvent" ("avatarImgId");
--> statement-breakpoint
create index plus_vote_year_month on "PlusVote" ("year", "month", "votedId", "tier", "score");
--> statement-breakpoint
create index reported_weapon_tournament_created_at on "ReportedWeapon" (
	"createdAt",
	"userId",
	"weaponSplId",
	"tournamentMatchId"
)
where
	"tournamentMatchId" is not null;
--> statement-breakpoint
create index reported_weapon_group_match_user_weapon on "ReportedWeapon" ("groupMatchId", "userId", "weaponSplId");
--> statement-breakpoint
create index skill_season_identifier_leaderboard on "Skill" ("season", "identifier", "ordinal", "matchesCount");
--> statement-breakpoint
create index skill_season_user_id_leaderboard on "Skill" (
	"season",
	"userId",
	"groupMatchId",
	"ordinal",
	"matchesCount"
);
--> statement-breakpoint
create index xrank_placement_power on "XRankPlacement" ("power" desc);
--> statement-breakpoint
create index xrank_placement_mode_power on "XRankPlacement" ("mode", "power" desc);
--> statement-breakpoint
create index xrank_placement_weapon_power on "XRankPlacement" ("weaponSplId", "power" desc);
--> statement-breakpoint
create index calendar_event_result_team_event_id on "CalendarEventResultTeam" ("eventId");
--> statement-breakpoint
create index user_map_mode_preferences on "User" ("id", "mapModePreferences")
where
	"mapModePreferences" is not null;
--> statement-breakpoint
create index group_status_active on "Group" ("status")
where
	"status" != 'INACTIVE';
--> statement-breakpoint
create index art_created_at on "Art" ("createdAt" desc);
--> statement-breakpoint
create table "UserReport" (
	"id" integer primary key autoincrement,
	"reportedUserId" integer not null,
	"reporterUserId" integer not null,
	"category" text not null,
	"description" text not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	"matchId" integer references "GroupMatch" ("id") on delete set null,
	foreign key ("reportedUserId") references "User" ("id") on delete cascade,
	foreign key ("reporterUserId") references "User" ("id") on delete cascade,
	unique ("reportedUserId", "reporterUserId")
) strict;
--> statement-breakpoint
create index user_report_reported_user_id_idx on "UserReport" ("reportedUserId");
--> statement-breakpoint
create table "TournamentMatch" (
	"id" integer primary key,
	"roundId" integer not null,
	"stageId" integer not null,
	"groupId" integer not null,
	"number" integer not null,
	"opponentOne" text,
	"opponentTwo" text,
	"winnerSide" text check ("winnerSide" in ('opponent1', 'opponent2')),
	"chatCode" text,
	"startedAt" integer,
	foreign key ("roundId") references "TournamentRound" ("id") on delete cascade,
	foreign key ("stageId") references "TournamentStage" ("id") on delete cascade,
	foreign key ("groupId") references "TournamentGroup" ("id") on delete cascade,
	unique ("number", "roundId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_match_round_id on "TournamentMatch" ("roundId");
--> statement-breakpoint
create index tournament_match_stage_id on "TournamentMatch" ("stageId");
--> statement-breakpoint
create index tournament_match_group_id on "TournamentMatch" ("groupId");
--> statement-breakpoint
create index idx_tournament_match_opponent_one_id on "TournamentMatch" ("opponentOne" ->> '$.id');
--> statement-breakpoint
create index idx_tournament_match_opponent_two_id on "TournamentMatch" ("opponentTwo" ->> '$.id');
--> statement-breakpoint
create index calendar_event_date_event_id_starts_at on "CalendarEventDate" ("eventId", "startsAt" desc);
--> statement-breakpoint
create index scrim_post_starts_at on "ScrimPost" ("startsAt");
--> statement-breakpoint
create table "TournamentAuditLog" (
	"id" integer primary key autoincrement,
	"tournamentId" integer not null,
	"type" text not null,
	"actorUserId" integer not null,
	"subjectUserId" integer,
	"tournamentTeamHistoryId" integer,
	"metadata" text,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade,
	foreign key ("actorUserId") references "User" ("id"),
	foreign key ("subjectUserId") references "User" ("id"),
	foreign key ("tournamentTeamHistoryId") references "TournamentTeamHistory" ("id")
) strict;
--> statement-breakpoint
create index tournament_audit_log_tournament_id_created_at_idx on "TournamentAuditLog" ("tournamentId", "createdAt");
--> statement-breakpoint
create index tournament_audit_log_tournament_id_team_history_id_type_created_at_idx on "TournamentAuditLog" (
	"tournamentId",
	"tournamentTeamHistoryId",
	"type",
	"createdAt"
);
--> statement-breakpoint
create table "TournamentStage" (
	"id" integer primary key,
	"tournamentId" integer not null,
	"name" text not null,
	"type" text not null,
	"settings" text not null,
	"number" integer not null,
	"createdAt" integer default (strftime('%s', 'now')) not null,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade,
	unique ("number", "tournamentId")
	on conflict rollback
) strict;
--> statement-breakpoint
create index tournament_stage_tournament_id on "TournamentStage" ("tournamentId");
--> statement-breakpoint
create table "Trophy" (
	"id" integer primary key,
	"name" text not null,
	"model" text not null,
	"code" text unique,
	"organizationId" integer,
	"creatorId" integer,
	"managerId" integer,
	foreign key ("organizationId") references "TournamentOrganization" ("id") on delete set null,
	foreign key ("creatorId") references "User" ("id") on delete set null,
	foreign key ("managerId") references "User" ("id") on delete set null
) strict;
--> statement-breakpoint
create table "TrophyOwner" (
	"trophyId" integer not null,
	"userId" integer not null,
	"tournamentId" integer not null,
	"tier" integer,
	foreign key ("trophyId") references "Trophy" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	foreign key ("tournamentId") references "Tournament" ("id") on delete cascade
) strict;
--> statement-breakpoint
create unique index "trophy_owner_tournament_user_unique" on "TrophyOwner" ("tournamentId", "userId", "trophyId");
--> statement-breakpoint
create index "trophy_owner_user_id" on "TrophyOwner" ("userId");
--> statement-breakpoint
create index "trophy_owner_trophy_id" on "TrophyOwner" ("trophyId", "userId");
--> statement-breakpoint
create table "SpecialTrophyOwner" (
	"trophyId" integer not null,
	"userId" integer not null,
	"createdAt" integer not null,
	primary key ("trophyId", "userId"),
	foreign key ("trophyId") references "Trophy" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade
) strict;
--> statement-breakpoint
create table "PendingTrophy" (
	"id" integer primary key,
	"name" text not null,
	"model" text not null,
	"description" text not null,
	"organizationId" integer,
	"submitterUserId" integer not null,
	"createdAt" integer not null,
	"declineReason" text,
	"declinedAt" integer,
	"declinedByUserId" integer,
	"targetTrophyId" integer,
	"managerId" integer,
	foreign key ("organizationId") references "TournamentOrganization" ("id") on delete set null,
	foreign key ("submitterUserId") references "User" ("id") on delete cascade,
	foreign key ("declinedByUserId") references "User" ("id") on delete set null,
	foreign key ("targetTrophyId") references "Trophy" ("id") on delete cascade,
	foreign key ("managerId") references "User" ("id") on delete set null
) strict;
--> statement-breakpoint
create index "pending_trophy_submitter_idx" on "PendingTrophy" ("submitterUserId");
--> statement-breakpoint
create table "PendingTrophyApproval" (
	"pendingTrophyId" integer not null,
	"userId" integer not null,
	"createdAt" integer not null,
	foreign key ("pendingTrophyId") references "PendingTrophy" ("id") on delete cascade,
	foreign key ("userId") references "User" ("id") on delete cascade,
	unique ("pendingTrophyId", "userId")
) strict;
--> statement-breakpoint
create index "calendar_event_trophy_id" on "CalendarEvent" ("trophyId");
