import { Arcane, ColorMap, Item, ModResolveable, ModUnion, RawColors } from "@wfcd/items";

//#region src/supporting/BaseObject.d.ts
interface BaseObject {
  uniqueName: string;
  xp: number;
  polarized: number;
  focus?: string;
  features?: number;
  upgrades: ModResolveable[];
  skins?: Array<{
    uniqueName: string;
  }>;
  pricol?: RawColors;
  attcol?: RawColors;
  sigcol?: RawColors;
  eyecol?: RawColors;
  hide?: boolean;
}
//#endregion
//#region src/Archwing.d.ts
declare class WarframeArchwing {
  uniqueName: string;
  archwing?: Item;
  xp: number;
  polarized: number;
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  colors: {
    primary?: ColorMap;
    attachments?: ColorMap;
  };
  constructor(archwing: BaseObject);
}
//#endregion
//#region src/Companion.d.ts
interface RawCompanion extends BaseObject {
  type: string;
  itemName?: string;
  upgrades: ModResolveable[];
}
declare class WarframeCompanion {
  uniqueName: string;
  name?: string;
  companion?: Item;
  xp: number;
  polarized: number;
  cosmetics?: {
    uniqueName: string;
  }[];
  colors: {
    primary?: ColorMap;
    attachments?: ColorMap;
  };
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  type: string;
  constructor(companion: RawCompanion);
}
//#endregion
//#region src/Mech.d.ts
declare class WarframeMech {
  uniqueName: string;
  mech?: Item;
  xp: number;
  polarized: number;
  cosmetics?: Array<Item | {
    uniqueName: string;
  }>;
  colors: {
    primary?: ColorMap;
    sigil?: ColorMap;
    attachments?: ColorMap;
  };
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  features?: number;
  constructor(mech: BaseObject);
}
//#endregion
//#region src/OperatorAmp.d.ts
interface RawAmp extends BaseObject {
  modularParts?: {
    LWPT_AMP_OCULUS: string;
    LWPT_AMP_BRACE: string;
    LWPT_AMP_CORE: string;
  };
}
interface AmpParts {
  prism: Item | {
    uniqueName: string;
  };
  scaffold: Item | {
    uniqueName: string;
  };
  brace: Item | {
    uniqueName: string;
  };
}
declare class OperatorAmp {
  xp: number;
  polarized: number;
  amp: Item | object;
  parts: AmpParts | undefined;
  colors: ColorMap | undefined;
  constructor(amp: RawAmp);
}
//#endregion
//#region src/Parazon.d.ts
declare class WarframeParazon {
  uniqueName: string;
  xp: number;
  polarized: number;
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  cosmetics?: {
    uniqueName: string;
  }[];
  colors?: ColorMap;
  constructor(parazon: BaseObject);
}
//#endregion
//#region src/Player.d.ts
interface PlayerInformation {
  playerName: string;
  masteryRank: number;
  lastUpdated: number;
  glyph: string;
  title?: string;
  focus?: string;
}
/** Warframe Player information */
declare class WarframePlayer {
  /**
   * Player name
   */
  name: string;
  /**
   * Player mastery rank
   */
  masteryRank: number;
  /**
   * Last updated date/time
   */
  lastUpdated: Date;
  /**
   * Glyph item
   */
  glyph: Item | string;
  /**
   * Currently selected focus school
   */
  focusSchool: string;
  constructor(data: PlayerInformation);
}
//#endregion
//#region src/Weapon.d.ts
interface RawWeapon extends BaseObject {
  itemName?: string;
  modularParts?: Record<string, string>;
}
declare class WarframeWeapon {
  xp: number;
  polarized: number;
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  name?: string;
  cosmetics: {
    uniqueName: string;
  }[];
  parts?: Record<string, Item | {
    uniqueName: string;
  }>;
  weapon?: Item | {
    uniqueName: string;
  };
  colors?: {
    primary?: ColorMap;
  };
  constructor(weapon: RawWeapon);
}
//#endregion
//#region src/Railjack.d.ts
type RawItemObject = {
  uniqueName: string;
};
type CrewMemberSlots = {
  SLOT_A: RawCrewMember;
  SLOT_B: RawCrewMember;
  SLOT_C: RawCrewMember;
};
type CrewMemberSkill = {
  Assinged: number;
};
interface RawRailjackObject {
  railjack: RawRailjack;
  armaments: RawArmaments;
  crew: {
    members: CrewMemberSlots;
  };
}
interface RawRailjack extends BaseObject {
  itemName: string;
  modularParts: {
    SHIELD: RawItemObject;
    ENGINES: RawItemObject;
    REACTOR: RawItemObject;
    HULL: RawItemObject;
  };
}
interface RailjackLoadout {
  shield: Item | RawItemObject;
  engines: Item | RawItemObject;
  reactor: Item | RawItemObject;
  hull: Item | RawItemObject;
}
interface RawArmaments {
  modularParts: {
    PILOT: RawItemObject;
    ORDINANCE: RawItemObject;
    PORT_GUNS: RawItemObject;
  };
}
interface RawCrewMember extends BaseObject {
  role: number;
  skills: {
    PILOTING: CrewMemberSkill;
    GUNNERY: CrewMemberSkill;
    ENGINEERING: CrewMemberSkill;
    COMBAT: CrewMemberSkill;
    SURVIVABILITY: CrewMemberSkill;
  };
  suit: string;
  secondincommand: boolean;
  crewweapon: RawWeapon;
  faction: string;
}
declare class Armaments {
  pilot: Item | RawItemObject;
  portGuns: Item | RawItemObject;
  ordinance: Item | RawItemObject;
  constructor(armaments: RawArmaments);
}
declare class CrewMember {
  uniqueName: string;
  xp: number;
  skills: {
    piloting: number;
    gunnery: number;
    repair: number;
    combat: number;
    endurance: number;
  };
  isSecondInCommand: boolean;
  weapon: WarframeWeapon;
  colors: {
    primary?: ColorMap;
    attachments?: ColorMap;
    syandana?: ColorMap;
    sigil?: ColorMap;
  };
  /**
   * 1 - Defender
   * 2 - Pilot
   * 3 - Gunner
   * 4 - Engineer
   */
  role: number;
  constructor(member: RawCrewMember);
}
declare class Railjack {
  uniqueName: string;
  name: string;
  loadout: RailjackLoadout;
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  armaments: Armaments;
  crewMembers: CrewMember[];
  color: {
    primary?: ColorMap;
  };
  constructor({
    railjack,
    armaments,
    crew
  }: RawRailjackObject);
}
//#endregion
//#region src/Warframe.d.ts
declare class Warframe {
  uniqueName: string;
  warframe?: Item;
  xp: number;
  polarized: number;
  features?: number;
  cosmetics: {
    uniqueName: string;
  }[];
  upgrades: {
    arcanes: Arcane[];
    mods: ModUnion[];
  };
  colors: {
    primary?: ColorMap;
    attachments?: ColorMap;
    syandana?: ColorMap;
    sigil?: ColorMap;
  };
  constructor(frame: BaseObject);
}
//#endregion
//#region src/ArsenalParser.d.ts
interface BaseArsenalData {
  accountInfo: PlayerInformation;
  loadOuts: BaseLoadouts;
}
interface BaseLoadouts {
  NORMAL: {
    warframe: BaseObject;
    primary: RawWeapon;
    secondary: RawWeapon;
    melee: RawWeapon;
    heavy: RawWeapon;
    exalted: RawWeapon | RawCompanion;
  };
  ARCHWING: {
    archwing: BaseObject;
    primary: RawWeapon;
    melee: RawWeapon;
  };
  DATAKNIFE: {
    parazon: BaseObject;
    primary: BaseObject;
  };
  OPERATOR: {
    amp: BaseObject;
  };
  SENTINEL: {
    roboticweapon?: RawWeapon;
    companion?: RawCompanion;
  };
  MECH: {
    mech: BaseObject;
    heavy: RawWeapon;
    exalted: RawWeapon;
  };
  RAILJACK: RawRailjackObject;
}
interface ArsenalLoadout {
  warframe: Warframe;
  primary?: WarframeWeapon;
  secondary?: WarframeWeapon;
  melee?: WarframeWeapon;
  heavy?: WarframeWeapon;
  exalted?: WarframeWeapon;
  vechiles?: VechilesLoadout;
  parazon?: WarframeParazon;
  amp?: OperatorAmp;
  companion?: WarframeCompanion;
  roboticweapon?: WarframeWeapon;
  railjack?: Railjack;
}
interface VechilesLoadout {
  archwing?: WarframeArchwing;
  primary?: WarframeWeapon;
  melee?: WarframeWeapon;
  necramech?: {
    mech: WarframeMech;
    heavy: WarframeWeapon;
    exalted: WarframeWeapon;
  };
}
declare class ArsenalData {
  account: WarframePlayer;
  loadout: ArsenalLoadout;
  exalted?: WarframeCompanion;
  constructor(data: BaseArsenalData);
}
//#endregion
export { ArsenalLoadout, BaseArsenalData, BaseLoadouts, VechilesLoadout, ArsenalData as default };