import type { BagType, KickTable } from "../../engine";
import type { Game } from "../game";

export interface Stats {
  altitude: number;
  apm: number;
  btb: number;
  garbagereceived: number;
  garbagesent: number;
  kills: number;
  pps: number;
  rank: number;
  revives: number;
  targetingfactor: number;
  targetinggrace: number;
  vsscore: number;
}

export interface VersusReplay {
  gamemode: "league" | null;
  id: string | null;
  replay: {
    leaderboard: {
      id: string;
      username: string;
      wins: number;
      active: boolean;
      naturalorder: number;
      shadowedBy: [null, null];
      shadows: [];
      stats: Stats & {
        escapeartist: null | unknown;
        blockrationing_app: null | unknown;
        blockrationing_final: null | unknown;
      };
    }[];
    rounds: {
      active: boolean;
      alive: boolean;
      id: string;
      lifetime: number;
      naturalorder: number;
      replay: {
        frames: number;
        events: Game.Replay.Frame[];
        options: {
          allow_harddrop: boolean;
          allclear_b2b: number;
          allclear_b2b_dupes: boolean;
          allclear_b2b_sends: boolean;
          allclear_garbage: number;
          allow180: boolean;
          b2bcharge_base: number;
          boardheight: number;
          boardwidth: number;
          bagtype: BagType;
          b2bchaining: boolean;
          b2bcharging: boolean;
          bgmnoreset: boolean;
          countdown: boolean;
          combotable: Game.ComboTable;
          countdown_count: number;
          clutch: boolean;
          display_username: boolean;
          display_hold: boolean;
          forfeit_time: number;
          fullinterval: number;
          fulloffset: number;
          gameid: number;
          garbagemultiplier: number;
          garbageincrease: number;
          garbageblocking: Game.GarbageBlocking;
          garbagemargin: number;
          garbagespeed: number;
          garbageholesize: number;
          garbagecap: number;
          garbagecapincrease: number;
          garbagecapmargin: number;
          garbagecapmax: number;
          garbageabsolutecap: number;
          garbagespecialbonus: boolean;
          garbagetargetbonus: Game.GarbageTargetBonus;
          g: number;
          gincrease: number;
          gmargin: number;
          gravitymay20g: boolean;
          handling: Game.Handling;
          hasgarbage: boolean;
          infinite_hold: boolean;
          kickset: KickTable;
          latencymode: string;
          lockresets: number;
          manual_allowed: boolean;
          messiness_change: number;
          messiness_nosame: boolean;
          messiness_timeout: number;
          messiness_inner: number;
          messiness_center?: boolean;
          mission: string;
          mission_type: string;
          neverstopbgm: boolean;
          noextrawidth: boolean;
          nolockout: boolean;
          openerphase: number;
          passthrough: Game.Passthrough;
          precountdown: number;
          prestart: number;
          roundmode: Game.RoundingMode;
          seed: number;
          seed_random: boolean;
          slot_bar1: string;
          slot_counter1: string;
          slot_counter2: string;
          slot_counter3: string;
          slot_counter4?: string;
          slot_counter5?: string;
          song: string;
          spinbonuses: Game.SpinBonuses;
          usebombs: boolean;
          username: string;
          version: number;
          zoominto: string;
        };
        results: {
          aggregatestats: {
            apm: number;
            pps: number;
            vsscore: number;
          };
          gameoverreason: "garbagesmash" | "topout" | "winner";
          stats: {
            btb: number;
            btbpower: number;
            clears: {
              allclear: number;
              doubles: number;
              minitspindoubles: number;
              minitspinquads: number;
              minitspins: number;
              minitspinsingles: number;
              minitspintriples: number;
              pentas: number;
              quads: number;
              realtspins: number;
              singles: number;
              triples: number;
              tspindoubles: number;
              tspinpentas: number;
              tspinquads: number;
              tspinsingles: number;
              tspintriples: number;
            };
            combo: number;
            combopower: number;
            finaltime: number;
            finesse: {
              combo: number;
              faults: number;
              perfectpieces: number;
            };
            garbage: {
              attack: number;
              cleared: number;
              maxspike: number;
              maxspike_nomult: number;
              received: number;
              sent: number;
              sent_nomult: number;
            };
            holds: number;
            inputs: number;
            kills: number;
            level: number;
            level_lines: number;
            level_lines_needed: number;
            lines: number;
            piecesplaced: number;
            score: number;
            topbtb: number;
            topcombo: number;
            tspins: number;
            zenith: {
              altitude: number;
              avgrankpts: number;
              floor: number;
              peakrank: number;
              rank: number;
              revives: number;
              revivesMaxOfBoth: number;
              revivesTotal: number;
              speedrun: boolean;
              speedrun_seen: boolean;
              splits: number[];
              targetingfactor: number;
              targetinggrace: number;
              totalbonus: number;
            };
            zenlevel: number;
            zenprogress: number;
          };
        };
      };
      shadowedBy: [null, null];
      shadows: [];
      stats: Stats;
    }[][];
  };
  ts: string;
  users: {
    id: string;
    username: string;
    flags: number;
    country: string | null;
    avatar_revision: number;
    banner_revision: number;
    doesNotExist?: true;
  }[];
  version: number;
}
