using System;

public class SurvivalState
{
    private const float HungerDrainPerSecond = 0.035f;
    private const float ThirstDrainPerSecond = 0.055f;
    private const float PassiveEnergyDrainPerSecond = 0.025f;
    private const float AutoConsumeThreshold = 35f;

    public float hunger = 100f;
    public float thirst = 100f;
    public float energy = 100f;

    public float maxHunger = 100f;
    public float maxThirst = 100f;
    public float maxEnergy = 100f;

    public bool isDead = false;
    public string deathReason = "";
    public string currentStatus = "";

    public void Update(double delta)
    {
        if (isDead) return;

        hunger = Math.Clamp(hunger - HungerDrainPerSecond * (float)delta, 0f, maxHunger);
        thirst = Math.Clamp(thirst - ThirstDrainPerSecond * (float)delta, 0f, maxThirst);
        energy = Math.Clamp(energy - PassiveEnergyDrainPerSecond * (float)delta, 0f, maxEnergy);

        TryAutoConsumeFood();
        TryAutoConsumeWater();
        TryAutoConsumeEnergy();
        UpdateStatus();
        CheckDeath();
    }

    public bool TryConsumeEnergy(float amount)
    {
        if (amount <= 0f) return true;
        if (energy < amount) return false;

        energy -= amount;
        return true;
    }

    private void TryAutoConsumeFood()
    {
        if (hunger > AutoConsumeThreshold) return;
        if (!GameData.inventory.TryRemoveItem("mushroom", 1)) return;

        hunger = Math.Clamp(hunger + 35f, 0f, maxHunger);
    }

    private void TryAutoConsumeWater()
    {
        if (thirst > AutoConsumeThreshold) return;
        if (!GameData.inventory.TryRemoveItem("water", 1)) return;

        thirst = Math.Clamp(thirst + 40f, 0f, maxThirst);
    }

    private void TryAutoConsumeEnergy()
    {
        if (energy > AutoConsumeThreshold) return;

        if (GameData.inventory.TryRemoveItem("battery_v2", 1))
        {
            energy = Math.Clamp(energy + 70f, 0f, maxEnergy);
            return;
        }

        if (GameData.inventory.TryRemoveItem("battery_v1", 1))
        {
            energy = Math.Clamp(energy + 45f, 0f, maxEnergy);
            return;
        }

        if (GameData.inventory.TryRemoveItem("steam", 1))
        {
            energy = Math.Clamp(energy + 25f, 0f, maxEnergy);
        }
    }

    private void UpdateStatus()
    {
        if (hunger <= AutoConsumeThreshold)
        {
            currentStatus = "Food supply critical";
            return;
        }

        if (thirst <= AutoConsumeThreshold)
        {
            currentStatus = "Water supply critical";
            return;
        }

        if (energy <= AutoConsumeThreshold)
        {
            currentStatus = "Energy reserves critical";
            return;
        }

        currentStatus = "Survival stable";
    }

    private void CheckDeath()
    {
        if (hunger <= 0f)
        {
            KillPlayer("Starved");
            return;
        }

        if (thirst <= 0f)
        {
            KillPlayer("Died of thirst");
            return;
        }

        if (energy <= 0f)
        {
            KillPlayer("Life support lost power");
        }
    }

    private void KillPlayer(string reason)
    {
        isDead = true;
        deathReason = reason;
        currentStatus = "Survival failed: " + reason;
        GameData.canMove = false;
    }
}
