package tactic

import "github.com/golangconf/gophers-and-dragons/game"

func ChooseCard(s game.State) game.CardType {

	if s.Avatar.HP < 20 && s.Creep.CreepStats.Damage[0] <=3 && s.Can(game.CardHeal) {
			return game.CardHeal
	}
	if s.Avatar.HP < 10 && s.Can(game.CardHeal) {
			return game.CardHeal
	}

	if s.Avatar.HP < 7 && s.Creep.Traits.Has(game.TraitSlow) {
		return game.CardRetreat
	}

	if s.Creep.Type == game.CreepFairy {
		return FairyMonsterAttack(s)
	}

	if s.Creep.Type == game.CreepDragon {
		return DragonMonsterAttack(s)
	}

	if s.Creep.Type == game.CreepMummy {
		return MummyMonsterAttack(s)
	}

	if s.Creep.Type == game.CreepKubus {
		return KubusMonsterAttack(s)
	}

	if s.Creep.Type == game.CreepClaws {
		return ClawsMonsterAttack(s)
	}

	if s.Creep.HP > 15 {
		return BestMonsterAttack(s)
	}

	return DefaulMonsterAttack(s)
}

func FairyMonsterAttack(s game.State) game.CardType {
    if s.Can(game.CardFirebolt) && s.Creep.HP == 4 {
		    return game.CardFirebolt
	  }
    
    return BestMonsterAttack(s)
}


func DragonMonsterAttack(s game.State) game.CardType {
	if s.Can(game.CardParry) {
		return game.CardParry
	}

	if s.Can(game.CardStun) && !s.Creep.IsStunned() {
		return game.CardStun
	}

	if s.Avatar.HP >= 3 && s.Avatar.HP < 7 && s.Can(game.CardRest) {
		return game.CardRest
	}

  if s.Avatar.HP == 7 && s.Creep.HP > 4 && !s.Creep.IsStunned() {
		return game.CardRetreat
	}

	if s.Can(game.CardPowerAttack) {
		return game.CardPowerAttack
	}

	return game.CardAttack
}

func ClawsMonsterAttack(s game.State) game.CardType {
	if s.Can(game.CardHeal) && s.Avatar.HP < 20 {
		return game.CardHeal
	}

	if s.Avatar.HP < 20 {
		return BestMonsterAttack(s)
	}

	return game.CardAttack
}

func KubusMonsterAttack(s game.State) game.CardType {
	if s.RoundTurn < 3 && s.Avatar.HP < 25 && s.Deck[game.CardHeal].Count > 1 {
		if s.Can(game.CardHeal) {
			return game.CardHeal
		}
	}

	if s.RoundTurn == 1 && (s.Deck[game.CardStun].Count <= 1 && s.Deck[game.CardParry].Count <= 2 && s.Deck[game.CardPowerAttack].Count <= 1) {
		return game.CardRetreat
	}

	return BestMonsterAttack(s)
}

func MummyMonsterAttack(s game.State) game.CardType {
	if s.RoundTurn <= 2 && s.Avatar.MP < 3 {
		return game.CardRetreat
	}

	if s.Can(game.CardFirebolt) && s.Creep.HP > 4 {
		return game.CardFirebolt
	}

	return game.CardAttack
}

func BestMonsterAttack(s game.State) game.CardType {
	mageLimit := 2

	if s.Avatar.MP < 7 {
		mageLimit = 10
	}
	if s.Round < 5 {
		mageLimit = 3
	}
	if s.NextCreep != game.CreepDragon {
		mageLimit = 0
	}
	if s.Round == 8 && s.NextCreep != game.CreepMummy {
		mageLimit = 0
	}

	if s.Creep.HP <= 3 {
		return DefaulMonsterAttack(s)
	}

	if s.Can(game.CardParry) && s.Creep.Type != game.CreepFairy {
    if s.Deck[game.CardParry].Count > 2 && s.Creep.CreepStats.Damage[0] >= 3 {
		    return game.CardParry
    }
    if s.Deck[game.CardParry].Count >= 5 && s.Creep.CreepStats.Damage[0] >= 2 {
		    return game.CardParry
    }
	}

	if s.Can(game.CardStun) && !s.Creep.IsStunned() && s.Deck[game.CardStun].Count > 1 {
		return game.CardStun
	}

	if s.Can(game.CardFirebolt) && s.Deck[game.CardFirebolt].Count > mageLimit {
		return game.CardFirebolt
	}

	if s.Can(game.CardPowerAttack) && s.Deck[game.CardPowerAttack].Count > 1 {
		return game.CardPowerAttack
	}

	return DefaulMonsterAttack(s)
}

func DefaulMonsterAttack(s game.State) game.CardType {
	if s.Creep.Type == game.CreepKubus && s.Creep.HP == 3 {
		return game.CardMagicArrow
	}

	if s.Avatar.MP > 14 && s.Creep.HP == 3 {
		return game.CardMagicArrow
	}

	return game.CardAttack
}