package;

import flixel.FlxG;
import flixel.FlxSprite;

class Gel extends FlxSprite
{	
	// Modifiers Range
	private var MIN_LEVEL(default, never):Int = 0;
	private var MAX_LEVEL(default, never):Int = 100;

	// Usless Stats that have no pupose yet
	public var Intellect:Int = 1; // had to be somewhat smart to get out of the egg
	public var Age:Int = 0;

	// Mood Modifiers
	public var Happiness:Int = 50;
	public var Discipline:Int = 50;
	public var Fullness = 50;
	public var Sleepiness = 0;
	public var Waste = 0;

	//private var _inEgg:Bool = true;
	public var _isHungry:Bool = false;
	public var _wasteReady:Bool = false;
	public var _madeWaste:Bool = false;
	public var _isTired:Bool = false;
	public var _isAsleep:Bool = false;

	// Mood/Needs
	public var CurrentMood:Mood = NEUTRAL;
	public var CurrentNeed:Need = NONE;

	//
	public var Wait:Bool = false;

	// Gels internal clock
	private var _clock:Clock;

	public function new(?X:Float=0, ?Y:Float=0)
	{
		super(X, Y);

		loadGraphic(AssetPaths.Player__png, true, 64, 64);
		animation.add("neutral", [0, 1, 2, 3, 4, 5, 4, 3, 2, 1], 2, true);
		animation.add("happy", [6, 7, 8, 9, 10, 11, 10, 9, 8, 7], 2, true);
		animation.add("angry", [12, 13, 14, 13], 2, true);
		animation.add("sleeping", [15, 16, 17, 16], 2, true);
		animation.add("excited", [18, 19, 20, 19], 3, false);
		animation.add("ashamed", [21, 22, 23, 22], 3, false);

		_clock = new Clock();

		// DEBUG
		FlxG.watch.add(this, "Age");
		FlxG.watch.add(this, "CurrentMood");
		FlxG.watch.add(this, "CurrentNeed");
		FlxG.watch.add(this, "Wait");
		FlxG.watch.add(this, "Happiness");
		FlxG.watch.add(this, "Discipline");
		FlxG.watch.add(this, "Fullness");
		FlxG.watch.add(this, "_isHungry");
		FlxG.watch.add(this, "Waste");
		FlxG.watch.add(this, "_wasteReady");
		FlxG.watch.add(this, "_madeWaste");
		FlxG.watch.add(this, "Sleepiness");
		FlxG.watch.add(this, "_isTired");
		FlxG.watch.add(this, "_isAsleep");
	}

	override function update(elapsed:Float):Void
	{
		super.update(elapsed);

		_clock.update();
		if (_clock.HourPassed)
			newHour();
		if (_clock.DayPassed)
			newDay();

		checkMood();
		checkNeed();
		checkRange();
	}

	private function checkMood():Void
	{
		if (Happiness >= 61)
			CurrentMood = HAPPY;
		else if (Happiness >= 40 && Happiness <= 60)
			CurrentMood = NEUTRAL;
		else if (Happiness <= 39)
			CurrentMood = ANGRY;
	}

	private function checkNeed():Void
	{
		// TODO: Add need stat triggers

		// Fullness Checks
		if(Fullness < 50)
			_isHungry = true;
		else
			_isHungry = false;

		// Waste Check
		if(Waste > 75 && Waste < 100)
			_wasteReady = true;
		else if (Waste >= 100)
			makeWaste();
		else
			_wasteReady = false;


		if (_isHungry)
			CurrentNeed = HUNGRY;
		else if (_wasteReady)
			CurrentNeed = POOPY;
		else if (_isTired)
			CurrentNeed = SLEEPY;
		else
			CurrentNeed = NONE;
	}


	public function EatFood():Void
	{
		Wait = true;
		// Stat changes

		if ((Fullness + 25) > 100)
		{
			Happiness -= 5; // Unhappy from over feeding
			// TODO: Play ashamed animationx
			// TODO:  Add another penelty
		}
		else
		{
			Fullness += 25;
			Happiness += 10;
			Discipline -=5;
			Waste +=5;
		}
	}

	public function Praise():Void
	{
		Wait = true;

		// Can't Prasie if you have no Happiness to give
		if (Discipline < 10)
			return;

		Happiness += 10;
		Discipline -= 10;
		// TODO: Play excited animation
	}

	public function Scold():Void
	{
		Wait = true;

		// Can't Scold if you have no Discipline to give
		if (Discipline < 10)
			return;

		Happiness -= 10;
		Discipline += 10;
		// TODO: Play ashamed animation
	}

	public function Wipe():Void
	{
		Wait = true;
		// TODO: Lock Wipe down for the rest of hour
		
		// Early Wipe
		if (!_wasteReady)
		{
			Happiness -=5;
			// TODO: Pay ashamed animation to show bad wipe
			return;
		}

		// Good Wipe
		if (!_madeWaste)
		{
			Happiness += 10;
			Discipline += 10;
			// TODO: Play excited animation to show good wipe
		}

		// Late Wipe
		else 
		{
			Happiness -= 10;
			Discipline -= 10;
			_madeWaste = false;
		}
		Waste = 0;
	}

	private function makeWaste():Void
	{
		Waste = 0;
		_madeWaste = true;
		_wasteReady = false;
	}
	private function newHour():Void
	{
		Fullness -= 10;
		Sleepiness += 5;
		if (!_madeWaste)
			Waste += (FlxG.random.int(2, 5) * 5);
		
		// TODO: Add other stat changing conditions
		if (_isHungry)
			Happiness -= 10;
		if (_isTired)
		{
			Happiness -= 10;
			Discipline -= 5;
		}
		if (_madeWaste)
		{
			Happiness -=10;
			Discipline -=10;
		}


		// TODO: Unlock Wipe
		_clock.HourPassed = false;
	}

	private function newDay():Void
	{
		Age++;
		// TODO: Add END_GAME checks here
		_clock.DayPassed = false;
	}

	private function checkRange():Void
	{
		// TODO: clean this up, make a for loop to loop array ints
		if (Happiness > MAX_LEVEL)
			Happiness = MAX_LEVEL;
		else if (Happiness < MIN_LEVEL)
			Happiness = MIN_LEVEL;

		if (Discipline > MAX_LEVEL)
			Discipline = MAX_LEVEL;
		else if (Discipline < MIN_LEVEL)
			Discipline = MIN_LEVEL;

		if (Fullness > MAX_LEVEL)
			Fullness = MAX_LEVEL;
		else if (Fullness < MIN_LEVEL)
			Fullness = MIN_LEVEL;

		if (Sleepiness > MAX_LEVEL)
			Sleepiness = MAX_LEVEL;
		else if (Sleepiness < MIN_LEVEL)
			Sleepiness = MIN_LEVEL;

		if (Waste > MAX_LEVEL)
			Waste = MAX_LEVEL;
		else if (Waste < MIN_LEVEL)
			Waste = MIN_LEVEL;
	}
}

enum Mood 
{
	NEUTRAL;
	HAPPY;
	ANGRY;
	SLEEPING;

	ENCOURAGED;
	SAD;
}

enum Need
{
	NONE;
	HUNGRY;
	SLEEPY;
	POOPY;
}