namespace PKHeX.Core
{
    /// <summary>
    /// Generation 6 Static Encounter
    /// </summary>
    /// <inheritdoc cref="EncounterStatic"/>
    public sealed record EncounterStatic6 : EncounterStatic, IContestStats
    {
        public override int Generation => 6;

        public byte CNT_Cool   { get; init; }
        public byte CNT_Beauty { get; init; }
        public byte CNT_Cute   { get; init; }
        public byte CNT_Smart  { get; init; }
        public byte CNT_Tough  { get; init; }
        public byte CNT_Sheen  { get; init; }

        public EncounterStatic6(GameVersion game) : base(game) { }

        protected override bool IsMatchLocation(PKM pkm)
        {
            if (base.IsMatchLocation(pkm))
                return true;

            if (Species != (int) Core.Species.Pikachu)
                return false;

            // Cosplay Pikachu is given from multiple locations
            var loc = pkm.Met_Location;
            return loc is 180 or 186 or 194;
        }

        protected override bool IsMatchEggLocation(PKM pkm)
        {
            var eggloc = pkm.Egg_Location;
            if (!EggEncounter)
                return eggloc == EggLocation;

            if (!pkm.IsEgg) // hatched
                return eggloc == EggLocation || eggloc == Locations.LinkTrade6;

            // Unhatched:
            if (eggloc != EggLocation)
                return false;
            if (pkm.Met_Location is not 0 or Locations.LinkTrade6)
                return false;
            return true;
        }

        protected override void ApplyDetails(ITrainerInfo sav, EncounterCriteria criteria, PKM pk)
        {
            base.ApplyDetails(sav, criteria, pk);
            var pk6 = (PK6)pk;
            this.CopyContestStatsTo(pk6);
            pk6.SetRandomMemory6();
            pk6.SetRandomEC();
        }
    }
}