namespace pkNX.Structures;

public abstract class Move3DS : IMove
{
    protected readonly byte[] Data;
    protected abstract int SIZE { get; }
    protected Move3DS(byte[] data) => Data = data;

    public byte[] Write() => Data;

    public abstract int Type { get; set; }
    public abstract int Quality { get; set; }
    public abstract int Category { get; set; }
    public abstract int Power { get; set; }
    public abstract int Accuracy { get; set; }
    public abstract int PP { get; set; }
    public abstract int Priority { get; set; }
    public abstract int HitMin { get; set; }
    public abstract int HitMax { get; set; }
    public abstract int Inflict { get; set; }
    public abstract int InflictPercent { get; set; }
    public abstract MoveInflictDuration InflictCount { get; set; }
    public abstract int TurnMin { get; set; }
    public abstract int TurnMax { get; set; }
    public abstract int CritStage { get; set; }
    public abstract int Flinch { get; set; }
    public abstract int EffectSequence { get; set; }
    public abstract int Recoil { get; set; }
    public abstract Heal Healing { get; set; }
    public abstract MoveTarget Target { get; set; }
    public abstract int Stat1 { get; set; }
    public abstract int Stat2 { get; set; }
    public abstract int Stat3 { get; set; }
    public abstract int Stat1Stage { get; set; }
    public abstract int Stat2Stage { get; set; }
    public abstract int Stat3Stage { get; set; }
    public abstract int Stat1Percent { get; set; }
    public abstract int Stat2Percent { get; set; }
    public abstract int Stat3Percent { get; set; }
}

public interface IMove
{
    byte[] Write();

    public int Type { get; set; }
    public int Quality { get; set; }
    public int Category { get; set; }
    public int Power { get; set; }
    public int Accuracy { get; set; }
    public int PP { get; set; }
    public int Priority { get; set; }
    public int HitMin { get; set; }
    public int HitMax { get; set; }
    public int Inflict { get; set; }
    public int InflictPercent { get; set; }
    public MoveInflictDuration InflictCount { get; set; }
    public int TurnMin { get; set; }
    public int TurnMax { get; set; }
    public int CritStage { get; set; }
    public int Flinch { get; set; }
    public int EffectSequence { get; set; }
    public int Recoil { get; set; }
    public Heal Healing { get; set; }
    public MoveTarget Target { get; set; }
    public int Stat1 { get; set; }
    public int Stat2 { get; set; }
    public int Stat3 { get; set; }
    public int Stat1Stage { get; set; }
    public int Stat2Stage { get; set; }
    public int Stat3Stage { get; set; }
    public int Stat1Percent { get; set; }
    public int Stat2Percent { get; set; }
    public int Stat3Percent { get; set; }
}
