#pragma once

#include "../../DNACommon/DNACommon.hpp"
#include "IScriptObject.hpp"
#include "Parameters.hpp"

namespace DataSpec::DNAMP1 {
struct FishCloud : IScriptObject {
  AT_DECL_DNA_YAMLV
  String<-1> name;
  Value<atVec3f> location;
  Value<atVec3f> orientation;
  Value<atVec3f> volume;
  Value<bool> active;
  UniqueID32 model;
  AnimationParameters animationParameters;
  Value<atUint32> numBoids;
  Value<float> speed;
  Value<float> separationRadius;
  Value<float> cohesionMagnitude;
  Value<float> alignmentWeight;
  Value<float> separationMagnitude;
  Value<float> weaponRepelMagnitude;
  Value<float> playerRepelMagnitude;
  Value<float> containmentMagnitude;
  Value<float> scatterVel;
  Value<float> maxScatterAngle;
  Value<float> weaponRepelDampingSpeed;
  Value<float> playerRepelDampingSpeed;
  Value<float> containmentRadius;
  Value<atUint32> updateShift;
  Value<atVec4f> color; // CColor
  Value<bool> killable;
  Value<float> weaponKillRadius;
  UniqueID32 deathParticle1;
  Value<atUint32> deathParticle1Count;
  UniqueID32 deathParticle2;
  Value<atUint32> deathParticle2Count;
  UniqueID32 deathParticle3;
  Value<atUint32> deathParticle3Count;
  UniqueID32 deathParticle4;
  Value<atUint32> deathParticle4Count;
  Value<atUint32> deathSFX;
  Value<bool> repelFromThreats;
  Value<bool> hotInThermal;

  void nameIDs(PAKRouter<PAKBridge>& pakRouter) const override {
    if (model.isValid()) {
      PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(model);
      ent->name = name + "_model";
    }
    animationParameters.nameANCS(pakRouter, name + "_animp");
    if (deathParticle1.isValid()) {
      PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(deathParticle1);
      ent->name = name + "_deathParticle1";
    }
    if (deathParticle2.isValid()) {
      PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(deathParticle2);
      ent->name = name + "_deathParticle2";
    }
    if (deathParticle3.isValid()) {
      PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(deathParticle3);
      ent->name = name + "_deathParticle3";
    }
    if (deathParticle4.isValid()) {
      PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(deathParticle4);
      ent->name = name + "_deathParticle4";
    }
  }

  void gatherDependencies(std::vector<hecl::ProjectPath>& pathsOut,
                          std::vector<hecl::ProjectPath>& lazyOut) const override {
    g_curSpec->flattenDependencies(model, pathsOut);
    animationParameters.depANCS(pathsOut);
    g_curSpec->flattenDependencies(deathParticle1, pathsOut);
    g_curSpec->flattenDependencies(deathParticle2, pathsOut);
    g_curSpec->flattenDependencies(deathParticle3, pathsOut);
    g_curSpec->flattenDependencies(deathParticle4, pathsOut);
  }
};
} // namespace DataSpec::DNAMP1