using System;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Entities;
using WingsEmu.Game.EntityStatistics;
using WingsEmu.Game.Items;
using WingsEmu.Game.Revival;
using WingsEmu.Game.Skills;
using WingsEmu.Packets.Enums;

namespace WingsEmu.Game.Mates;

public interface IMateEntity : IBattleEntity, IMateRevivalComponent, IMonsterData
{
    short CloseDefence { get; set; }
    short DistanceDodge { get; set; }
    bool IsSitting { get; set; }
    bool IsUsingSp { get; set; }
    DateTime LastDeath { get; set; }
    DateTime LastDefence { get; set; }
    DateTime LastLowLoyaltyEffect { get; set; }
    DateTime LastHealth { get; set; }
    DateTime LastLoyaltyRecover { get; set; }
    DateTime LastSkillUse { get; set; }
    DateTime LastBasicSkill { get; set; }
    DateTime? SpawnMateByGuardian { get; set; }
    IPlayerEntity Owner { get; set; }
    byte PetSlot { get; set; }
    IBattleEntitySkill LastUsedPartnerSkill { get; set; }
    short HitRate { get; set; }
    byte Attack { get; set; }
    bool CanPickUp { get; set; }
    long CharacterId { get; set; }
    byte Defence { get; set; }
    long Experience { get; set; }
    bool IsSummonable { get; set; }
    bool IsTeamMember { get; set; }
    short Loyalty { get; set; }
    short MapX { get; set; }
    short MapY { get; set; }
    short MinilandX { get; set; }
    short MinilandY { get; set; }
    MateType MateType { get; set; }
    string MateName { get; set; }
    int NpcMonsterVNum { get; set; }
    short Skin { get; set; }
    int HitCriticalChance { get; set; }
    int HitCriticalDamage { get; set; }
    bool IsLimited { get; init; }
    DateTime? SpCooldownEnd { get; set; }
    DateTime LastEffect { get; set; }
    DateTime LastPetUpgradeEffect { get; set; }
    GameItemInstance Weapon { get; }
    GameItemInstance Armor { get; }
    GameItemInstance Gloves { get; }
    GameItemInstance Boots { get; }
    GameItemInstance Specialist { get; }
    SkillInfo BasicSkill { get; }
    IMateStatisticsComponent StatisticsComponent { get; }
    void RefreshStatistics();
    void Initialize();
}