using PSO2SERVER.Protocol.Packets;
using PSO2SERVER.Zone;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PSO2SERVER.Models
{
    // Class to represent PlayerStats
    public class BattlePlayerStats
    {
        public uint MaxHp { get; set; } = 0;
        public uint Hp { get; set; } = 0;
        public uint Dex { get; set; } = 0;

        public uint BaseMelPwr { get; set; } = 0;
        public uint WeaponMelPwr { get; set; } = 0;
        public uint BaseRngPwr { get; set; } = 0;
        public uint WeaponRngPwr { get; set; } = 0;
        public uint BaseTecPwr { get; set; } = 0;
        public uint WeaponTecPwr { get; set; } = 0;

        public uint BaseMelDef { get; set; } = 0;
        public uint BaseRngDef { get; set; } = 0;
        public uint BaseTecDef { get; set; } = 0;

        // Constructor to initialize with default values
        public BattlePlayerStats()
        {
        }
    }

    // Class to represent EnemyStats
    public class BattleEnemyStats
    {
        public string Name { get; set; } = string.Empty;
        public uint Level { get; set; } = 0;
        public uint Exp { get; set; } = 0;
        public PSOLocation Pos { get; set; } = new PSOLocation();

        public uint MaxHp { get; set; } = 0;
        public uint Hp { get; set; } = 0;
        public uint Dex { get; set; } = 0;

        public uint MaxMelPwr { get; set; } = 0;
        public uint MinMelPwr { get; set; } = 0;
        public uint MaxRngPwr { get; set; } = 0;
        public uint MinRngPwr { get; set; } = 0;
        public uint MaxTecPwr { get; set; } = 0;
        public uint MinTecPwr { get; set; } = 0;

        public uint MelDef { get; set; } = 0;
        public uint RngDef { get; set; } = 0;
        public uint TecDef { get; set; } = 0;

        public List<EnemyHitbox> Hitboxes { get; set; } = new List<EnemyHitbox>();

        // Constructor to initialize with default values
        public BattleEnemyStats()
        {
        }
    }

    // Enum to represent the BattleResult type
    public enum BattleResultType
    {
        Damaged,
        Killed
    }

    // Class to represent the BattleResult
    public class BattleResult
    {
        public BattleResultType ResultType { get; set; }

        public DamageReceivePacket DmgPacket { get; set; }
        public EnemyKilledPacket KillPacket { get; set; }
        public uint ExpAmount { get; set; }

        // Constructor for Damaged result
        public BattleResult(DamageReceivePacket dmgPacket)
        {
            ResultType = BattleResultType.Damaged;
            DmgPacket = dmgPacket;
        }

        // Constructor for Killed result
        public BattleResult(DamageReceivePacket dmgPacket, EnemyKilledPacket killPacket, uint expAmount)
        {
            ResultType = BattleResultType.Killed;
            DmgPacket = dmgPacket;
            KillPacket = killPacket;
            ExpAmount = expAmount;
        }
    }
}
