namespace PkmnLib.Dynamic.Models;

/// <summary>
/// Types of targets an item can have.
/// </summary>
[Flags]
public enum ItemTargetType
{
    /// <summary>
    /// The item does not require a target.
    /// </summary>
    None = 0,

    /// <summary>
    /// The item targets Pokémon that are part of the user's own team.
    /// </summary>
    OwnPokemon = 1,

    /// <summary>
    /// The item targets allied Pokémon.
    /// </summary>
    AllyPokemon = 2,

    /// <summary>
    /// The item targets opposing Pokémon.
    /// </summary>
    FoePokemon = 4,
}

/// <summary>
/// Helper methods for ItemTargetType.
/// </summary>
public static class ItemTargetTypeHelpers
{
    /// <summary>
    /// Determines if the given target is valid based on the ItemTargetType.
    /// </summary>
    public static bool IsValidTarget(this ItemTargetType targetType, IBattle battle, IPokemon user, IPokemon target)
    {
        if (targetType == ItemTargetType.None)
            return true;

        if (targetType.HasFlag(ItemTargetType.OwnPokemon))
        {
            var userParty = battle.Parties.FirstOrDefault(x => x.Party.Contains(user));
            var targetParty = battle.Parties.FirstOrDefault(x => x.Party.Contains(target));
            if (userParty is not null && targetParty is not null && userParty == targetParty)
                return true;
        }

        if (targetType.HasFlag(ItemTargetType.AllyPokemon))
        {
            if (user.BattleData?.BattleSide == target.BattleData?.BattleSide)
                return true;
        }

        if (targetType.HasFlag(ItemTargetType.FoePokemon))
        {
            var userParty = battle.Parties.FirstOrDefault(x => x.Party.Contains(user));
            var targetParty = battle.Parties.FirstOrDefault(x => x.Party.Contains(target));
            if (userParty is not null && targetParty is not null && userParty != targetParty)
                return true;
        }

        return false;
    }
}