/**
 * This file contains references to the generated types from api.ts as well as extensions to supplement their data.
 */

import type { Paths } from "./api";
import type { Guild } from "./Augmented/Guild";
import type { Player } from "./Augmented/Player";
import type {
  ElectionCurrent,
  ElectionMayor,
} from "./Augmented/Resources/SkyBlock/Election";
import type { SkyBlockAuction } from "./Augmented/SkyBlock/Auction";
import type { SkyBlockProfile } from "./Augmented/SkyBlock/Profile";

export type BoostersResponse = Paths.V2Boosters.Get.Responses.$200 &
  Record<string, unknown>;

export type CountsResponse = Paths.V2Counts.Get.Responses.$200 &
  Record<string, unknown>;

export type GuildResponse = Paths.V2Guild.Get.Responses.$200 &
  Record<string, unknown> & {
    guild: Guild | null;
  };

export type LeaderboardsResponse = Paths.V2Leaderboards.Get.Responses.$200 &
  Record<string, unknown>;

export type PlayerResponse = Paths.V2Player.Get.Responses.$200 &
  Record<string, unknown> & {
    player: Player | null;
  };

export type PunishmentStatsResponse = Paths.V2Punishmentstats.Get.Responses.$200 &
  Record<string, unknown>;

export type RecentGamesResponse = Paths.V2Recentgames.Get.Responses.$200 &
  Record<string, unknown>;

export type StatusResponse = Paths.V2Status.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesGamesResponse = Paths.V2ResourcesGames.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesAchievementsResponse = Paths.V2ResourcesAchievements.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesChallengesResponse = Paths.V2ResourcesChallenges.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesQuestsResponse = Paths.V2ResourcesQuests.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesGuildsAchievementsResponse = Paths.V2ResourcesAchievements.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesVanityCompanionsResponse = Paths.V2ResourcesVanityCompanions.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesVanityPetsResponse = Paths.V2ResourcesVanityPets.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesSkyblockBingoResponse = Paths.V2ResourcesSkyblockBingo.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesSkyblockCollectionsResponse = Paths.V2ResourcesSkyblockCollections.Get.Responses.$200 &
  Record<string, unknown> & {
    collections: {
      [key in
        | "FARMING"
        | "MINING"
        | "COMBAT"
        | "FORAGING"
        | "FISHING"
        | "RIFT"]: {
        name: string;
        items: {
          [key: string]: {
            name: string;
            maxTiers: number;
            tiers: {
              tier: number;
              amountRequired: number;
              unlocks: string[];
            }[];
          };
        };
      };
    } & {
      [key: string]:
        | {
            name: string;
            items: {
              [key: string]: {
                name: string;
                maxTiers: number;
                tiers: {
                  tier: number;
                  amountRequired: number;
                  unlocks: string[];
                }[];
              };
            };
          }
        | undefined;
    };
  };

export type ResourcesSkyblockElectionResponse = Paths.V2ResourcesSkyblockElection.Get.Responses.$200 &
  Record<string, unknown> & {
    mayor: ElectionMayor;
    current: ElectionCurrent | null;
  };

export type ResourcesSkyblockItemsResponse = Paths.V2ResourcesSkyblockItems.Get.Responses.$200 &
  Record<string, unknown>;

export type ResourcesSkyblockSkillsResponse = Paths.V2ResourcesSkyblockSkills.Get.Responses.$200 &
  Record<string, unknown> & {
    skills: {
      [key: string]: {
        name: string;
        description: string;
        maxLevel: number;
        levels: {
          level: number;
          totalExpRequired: number;
          unlocks: string[];
        }[];
      };
    };
  };

export type SkyblockNewsResponse = Paths.V2SkyblockNews.Get.Responses.$200 &
  Record<string, unknown> & {
    items: {
      item: {
        material: string;
      };
      link: string;
      text: string;
      title: string;
    }[];
  };

export type SkyblockAuctionResponse = Omit<
  Paths.V2SkyblockAuction.Get.Responses.$200,
  "auctions"
> & {
  auctions?: SkyBlockAuction[];
} & Record<string, unknown>;

export type SkyblockAuctionsResponse = Omit<
  Paths.V2SkyblockAuctions.Get.Responses.$200,
  "auctions"
> & {
  auctions?: SkyBlockAuction[];
} & Record<string, unknown>;

export type SkyblockAuctionsEndedResponse = Paths.V2SkyblockAuctionsEnded.Get.Responses.$200 &
  Record<string, unknown> & {
    auctions: {
      auction_id: string;
      seller: string;
      seller_profile: string;
      buyer: string;
      buyer_profile: string;
      timestamp: number;
      price: number;
      bin: boolean;
      item_bytes: string;
    }[];
  };

export type SkyblockBazaarResponse = Paths.V2SkyblockBazaar.Get.Responses.$200 &
  Record<string, unknown> & {
    products: {
      /** the key is the product id, e.g. CHILI_PEPPER */
      [product_id: string]: {
        product_id: string;
        sell_summary: {
          amount: number;
          pricePerUnit: number;
          orders: number;
        }[];
        buy_summary: {
          amount: number;
          pricePerUnit: number;
          orders: number;
        }[];
        quick_status: {
          productId: string;
          sellPrice: number;
          sellVolume: number;
          sellMovingWeek: number;
          sellOrders: number;
          buyPrice: number;
          buyVolume: number;
          buyMovingWeek: number;
          buyOrders: number;
        };
      };
    };
  };

export type SkyblockProfileResponse = Omit<
  Paths.V2SkyblockProfile.Get.Responses.$200,
  "profile"
> &
  Record<string, unknown> & {
    profile: SkyBlockProfile;
  };

export type SkyblockProfilesResponse = Omit<
  Paths.V2SkyblockProfiles.Get.Responses.$200,
  "profiles"
> &
  Record<string, unknown> & {
    profiles: SkyBlockProfile[];
  };

export type SkyblockMuseumResponse = Paths.V2SkyblockMuseum.Get.Responses.$200 &
  Record<string, unknown>;

export type SkyblockGardenResponse = Paths.V2SkyblockGarden.Get.Responses.$200 &
  Record<string, unknown>;

export type SkyblockBingoResponse = Paths.V2SkyblockBingo.Get.Responses.$200 &
  Record<string, unknown>;

export type SkyblockFiresalesResponse = Paths.V2SkyblockFiresales.Get.Responses.$200 &
  Record<string, unknown>;

export type HousingActiveResponse = Paths.V2HousingActive.Get.Responses.$200;

export type HousingHouseResponse = Paths.V2HousingHouse.Get.Responses.$200 &
  Record<string, unknown>;

export type HousingHousesResponse = Paths.V2HousingHouses.Get.Responses.$200;

export type MinecraftInventoryData = {
  type: number;
  data: string;
};
