using System.Linq;
using StardewModdingAPI;
using StardewValley;
namespace TrainerMod.Framework.Commands.Player
{
    /// A command which edits the player's current health.
    internal class SetHealthCommand : TrainerCommand
    {
        /*********
        ** Properties
        *********/
        /// Whether to keep the player's health at its maximum.
        private bool InfiniteHealth;
        /*********
        ** Accessors
        *********/
        /// Whether the command needs to perform logic when the game updates.
        public override bool NeedsUpdate => this.InfiniteHealth;
        /*********
        ** Public methods
        *********/
        /// Construct an instance.
        public SetHealthCommand()
            : base("player_sethealth", "Sets the player's health.\n\nUsage: player_sethealth [value]\n- value: an integer amount, or 'inf' for infinite health.") { }
        /// Handle the command.
        /// Writes messages to the console and log file.
        /// The command name.
        /// The command arguments.
        public override void Handle(IMonitor monitor, string command, ArgumentParser args)
        {
            // no-argument mode
            if (!args.Any())
            {
                monitor.Log($"You currently have {(this.InfiniteHealth ? "infinite" : Game1.player.health.ToString())} health. Specify a value to change it.", LogLevel.Info);
                return;
            }
            // handle
            string amountStr = args[0];
            if (amountStr == "inf")
            {
                this.InfiniteHealth = true;
                monitor.Log("OK, you now have infinite health.", LogLevel.Info);
            }
            else
            {
                this.InfiniteHealth = false;
                if (int.TryParse(amountStr, out int amount))
                {
                    Game1.player.health = amount;
                    monitor.Log($"OK, you now have {Game1.player.health} health.", LogLevel.Info);
                }
                else
                    this.LogArgumentNotInt(monitor);
            }
        }
        /// Perform any logic needed on update tick.
        /// Writes messages to the console and log file.
        public override void Update(IMonitor monitor)
        {
            if (this.InfiniteHealth)
                Game1.player.health = Game1.player.maxHealth;
        }
    }
}