package me.dannytatom.xibalba.world;

import aurelienribon.tweenengine.Tween;
import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.utils.Array;

import me.dannytatom.xibalba.ActionLog;
import me.dannytatom.xibalba.helpers.CombatHelpers;
import me.dannytatom.xibalba.helpers.EntityHelpers;
import me.dannytatom.xibalba.helpers.InputHelpers;
import me.dannytatom.xibalba.helpers.ItemHelpers;
import me.dannytatom.xibalba.helpers.MapHelpers;
import me.dannytatom.xibalba.systems.AbilitiesSystem;
import me.dannytatom.xibalba.systems.AttributesSystem;
import me.dannytatom.xibalba.systems.BrainSystem;
import me.dannytatom.xibalba.systems.DeathSystem;
import me.dannytatom.xibalba.systems.MouseMovementSystem;
import me.dannytatom.xibalba.systems.TileEffectSystem;
import me.dannytatom.xibalba.systems.actions.ExploreSystem;
import me.dannytatom.xibalba.systems.actions.MeleeSystem;
import me.dannytatom.xibalba.systems.actions.MovementSystem;
import me.dannytatom.xibalba.systems.actions.RangeSystem;
import me.dannytatom.xibalba.systems.statuses.BleedingSystem;
import me.dannytatom.xibalba.systems.statuses.BurningSystem;
import me.dannytatom.xibalba.systems.statuses.CharmedSystem;
import me.dannytatom.xibalba.systems.statuses.CrippledSystem;
import me.dannytatom.xibalba.systems.statuses.DrowningSystem;
import me.dannytatom.xibalba.systems.statuses.EncumberedSystem;
import me.dannytatom.xibalba.systems.statuses.PoisonedSystem;
import me.dannytatom.xibalba.systems.statuses.SickSystem;
import me.dannytatom.xibalba.systems.statuses.StuckSystem;
import me.dannytatom.xibalba.systems.statuses.WetSystem;
import me.dannytatom.xibalba.utils.EntityFactory;

public class WorldManager {
  public static Engine engine;
  public static ActionLog log;
  public static World world;
  public static State state;
  public static TargetState targetState;
  public static Array<Tween> tweens;
  public static EntityFactory entityFactory;
  public static InputHelpers inputHelpers;
  public static MapHelpers mapHelpers;
  public static CombatHelpers combatHelpers;
  public static EntityHelpers entityHelpers;
  public static ItemHelpers itemHelpers;
  public static Entity player;
  public static Entity god;
  public static boolean executeTurn;
  public static int turnCount;

  /**
   * Setup a whole bunch of shit.
   */
  public static void setup() {
    engine = new Engine();
    log = new ActionLog();
    world = new World();
    tweens = new Array<>();

    entityFactory = new EntityFactory();
    inputHelpers = new InputHelpers();
    mapHelpers = new MapHelpers();
    entityHelpers = new EntityHelpers();
    itemHelpers = new ItemHelpers();
    combatHelpers = new CombatHelpers();

    executeTurn = false;
    turnCount = 0;

    // Setup engine (systems are run in order added)
    engine.addSystem(new AttributesSystem());
    engine.addSystem(new AbilitiesSystem());
    engine.addSystem(new MouseMovementSystem());
    engine.addSystem(new ExploreSystem());
    engine.addSystem(new BrainSystem());
    engine.addSystem(new RangeSystem());
    engine.addSystem(new MeleeSystem());
    engine.addSystem(new MovementSystem());
    engine.addSystem(new TileEffectSystem());
    engine.addSystem(new EncumberedSystem());
    engine.addSystem(new CharmedSystem());
    engine.addSystem(new CrippledSystem());
    engine.addSystem(new BleedingSystem());
    engine.addSystem(new BurningSystem());
    engine.addSystem(new DrowningSystem());
    engine.addSystem(new StuckSystem());
    engine.addSystem(new PoisonedSystem());
    engine.addSystem(new SickSystem());
    engine.addSystem(new WetSystem());
    engine.addSystem(new DeathSystem());
  }

  public enum State {
    PLAYING, TARGETING, LOOKING, FOCUSED, MOVING, GOING_DOWN, GOING_UP, WAITING, DEAD
  }

  public enum TargetState {
    ABILITY, RELEASE, THROW
  }
}