#pragma once

#include "../../DNACommon/Tweaks/ITweakGunRes.hpp"

namespace DataSpec::DNAMP1 {

struct CTweakGunRes final : ITweakGunRes {
  AT_DECL_DNA_YAML

  String<-1> m_gunMotion;
  String<-1> m_grappleArm;
  String<-1> m_rightHand;

  String<-1> m_powerBeam;
  String<-1> m_iceBeam;
  String<-1> m_waveBeam;
  String<-1> m_plasmaBeam;
  String<-1> m_phazonBeam;

  String<-1> m_holoTransition;

  String<-1> m_bombSet;
  String<-1> m_bombExplode;
  String<-1> m_powerBombExplode;

  String<-1> m_powerBeamWp;
  String<-1> m_powerBallWp;
  String<-1> m_iceBeamWp;
  String<-1> m_iceBallWp;
  String<-1> m_waveBeamWp;
  String<-1> m_waveBallWp;
  String<-1> m_plasmaBeamWp;
  String<-1> m_plasmaBallWp;
  String<-1> m_phazonBeamWp;
  String<-1> m_phazonBallWp;

  String<-1> m_powerMuzzle;
  String<-1> m_iceMuzzle;
  String<-1> m_waveMuzzle;
  String<-1> m_plasmaMuzzle;
  String<-1> m_phazonMuzzle;

  String<-1> m_powerCharge;
  String<-1> m_iceCharge;
  String<-1> m_waveCharge;
  String<-1> m_plasmaCharge;
  String<-1> m_phazonCharge;

  String<-1> m_powerAuxMuzzle;
  String<-1> m_iceAuxMuzzle;
  String<-1> m_waveAuxMuzzle;
  String<-1> m_plasmaAuxMuzzle;
  String<-1> m_phazonAuxMuzzle;

  String<-1> m_grappleSegment;
  String<-1> m_grappleClaw;
  String<-1> m_grappleHit;
  String<-1> m_grappleMuzzle;
  String<-1> m_grappleSwoosh;

  const std::string& GetGunMotion() const override { return m_gunMotion; }
  const std::string& GetGrappleArm() const override { return m_grappleArm; }
  const std::string& GetRightHand() const override { return m_rightHand; }

  const std::string& GetPowerBeam() const override { return m_powerBeam; }
  const std::string& GetIceBeam() const override { return m_iceBeam; }
  const std::string& GetWaveBeam() const override { return m_waveBeam; }
  const std::string& GetPlasmaBeam() const override { return m_plasmaBeam; }
  const std::string& GetPhazonBeam() const override { return m_phazonBeam; }

  const std::string& GetHoloTransition() const override { return m_holoTransition; }

  const std::string& GetBombSet() const override { return m_bombSet; }
  const std::string& GetBombExplode() const override { return m_bombExplode; }
  const std::string& GetPowerBombExplode() const override { return m_powerBombExplode; }

  const std::string& GetWeapon(size_t idx, bool ball) const override { return (&m_powerBeamWp)[idx * 2 + ball]; }
  const std::string& GetMuzzleParticle(size_t idx) const override { return (&m_powerMuzzle)[idx]; }
  const std::string& GetChargeParticle(size_t idx) const override { return (&m_powerCharge)[idx]; }
  const std::string& GetAuxMuzzleParticle(size_t idx) const override { return (&m_powerAuxMuzzle)[idx]; }

  const std::string& GetGrappleSegmentParticle() const override { return m_grappleSegment; }
  const std::string& GetGrappleClawParticle() const override { return m_grappleClaw; }
  const std::string& GetGrappleHitParticle() const override { return m_grappleHit; }
  const std::string& GetGrappleMuzzleParticle() const override { return m_grappleMuzzle; }
  const std::string& GetGrappleSwooshParticle() const override { return m_grappleSwoosh; }

  CTweakGunRes() = default;
  CTweakGunRes(athena::io::IStreamReader& in) { read(in); }
};

} // namespace DataSpec::DNAMP1
