
/**
 * Extend the base Actor document by defining a custom roll data structure which is ideal for the Simple system.
 * @extends {Actor}
 */
export default class VermineActor extends Actor {

  /**
   * @override
   * Augment the basic actor data with additional dynamic data. Typically,
   * you'll want to handle most of your calculated/derived data in this step.
   * Data calculated in this step should generally not exist in template.json
   * (such as ability modifiers rather than ability scores) and should be
   * available both inside and outside of character sheets (such as if an actor
   * is queried and has a roll executed directly from it).
   */
  prepareDerivedData() {
    super.prepareDerivedData();
    const actorData = this;
    const systemData = actorData.system;
    const flags = actorData.flags.vermine2047 || {};

    // Make separate methods for each Actor type (character, npc, etc.) to keep
    // things organized.
    switch (this.type) {
      case "character":
        this._prepareCharacterData(actorData);
        break;
      case "npc":
        this._prepareNpcData(actorData);
        break;
      case "group":
        this._prepareGroupData(actorData);
        break;
      case "creature":
        this._prepareCreatureData(actorData);
        break;
    }

  }

  /**
   * Prepare Character type specific data
   */
  _prepareCharacterData(actorData) {
    // Character derived data is computed by VermineCharacterData.prepareDerivedData()
  }
  /**
   * Prepare NPC type specific data.
   */
  _prepareNpcData(actorData) {
    // NPC derived data is computed by VermineNpcData.prepareDerivedData()
  }

  /**
   * Prepare Group type specific data.
   */
  _prepareGroupData(actorData) {
    // Group derived data is computed by VermineGroupData.prepareDerivedData()
  }

  /**
   * Prepare Creature type specific data.
   */
  _prepareCreatureData(actorData) {
    // Creature derived data is computed by VermineCreatureData.prepareDerivedData()
  }

  /**
   * Override getRollData() that's supplied to rolls.
   */
  getRollData() {
    const data = super.getRollData();

    // Prepare character roll data.
    this._getCharacterRollData(data);
    this._getNpcRollData(data);

    return data;
  }

  /**
   * Prepare character roll data.
   */
  _getCharacterRollData(data) {
    if (this.type !== 'character') return;

    // Copy the ability scores to the top level, so that rolls can use
    // formulas like `@str.mod + 4`.
    if (data.abilities) {
      for (let [k, v] of Object.entries(data.abilities)) {
        data[k] = foundry.utils.deepClone(v);
      }
    }

    // Add level for easier access, or fall back to 0.
    if (data.attributes.level) {
      data.lvl = data.attributes.level.value ?? 0;
    }
  }

  /**
   * Prepare NPC roll data.
   */
  _getNpcRollData(data) {
    if (this.type !== 'npc') return;

    // Process additional NPC data here.
  }

  // Character derived-data methods removed — handled by VermineCharacterData.prepareDerivedData()

}