using System;
using System.Collections.Generic;
using static PKHeX.Core.EncounterServerDateCheck;
namespace PKHeX.Core;
///
/// Provides indication that the encounter may or may not have a specific date range to consider.
///
public interface IEncounterServerDate
{
///
/// If true, the date range it may be acquired at is restricted to a specific date range.
///
bool IsDateRestricted { get; }
}
///
/// Enumeration indicating if a date range check is satisfied.
///
public enum EncounterServerDateCheck
{
/// No need to consider date range.
None,
/// Date does fall within the range it was available.
Valid,
/// Date does NOT fall within the range it was available.
Invalid,
}
///
/// Logic to check if a date obtained is within the date of availability.
///
public static class EncounterServerDate
{
private static bool IsValidDate(DateTime obtained, DateTime start) => obtained >= start && obtained <= DateTime.UtcNow;
private static bool IsValidDate(DateTime obtained, DateTime start, DateTime end) => obtained >= start && obtained <= end;
private static bool IsValidDate(DateTime obtained, (DateTime Start, DateTime? End) value)
{
var (start, end) = value;
if (end is not { } x)
return IsValidDate(obtained, start);
return IsValidDate(obtained, start, x);
}
private static EncounterServerDateCheck Result(bool result) => result ? Valid : Invalid;
public static EncounterServerDateCheck IsValidDate(this IEncounterServerDate enc, DateTime obtained) => enc switch
{
WC8 wc8 => Result(IsValidDateWC8(wc8.CardID, obtained)),
WA8 wa8 => Result(IsValidDateWA8(wa8.CardID, obtained)),
WB8 wb8 => Result(IsValidDateWB8(wb8.CardID, obtained)),
_ => throw new ArgumentOutOfRangeException(nameof(enc)),
};
public static bool IsValidDateWC8(int cardID, DateTime obtained) => WC8Gifts.TryGetValue(cardID, out var time) && IsValidDate(obtained, time);
public static bool IsValidDateWA8(int cardID, DateTime obtained) => WA8Gifts.TryGetValue(cardID, out var time) && IsValidDate(obtained, time);
public static bool IsValidDateWB8(int cardID, DateTime obtained) => WB8Gifts.TryGetValue(cardID, out var time) && IsValidDate(obtained, time);
///
/// Minimum date the gift can be received.
///
public static readonly Dictionary WC8Gifts = new()
{
{9000, new DateTime(2020, 02, 12)}, // Bulbasaur
{9001, new DateTime(2020, 02, 12)}, // Charmander
{9002, new DateTime(2020, 02, 12)}, // Squirtle
{9003, new DateTime(2020, 02, 12)}, // Pikachu
{9004, new DateTime(2020, 02, 15)}, // Original Color Magearna
{9005, new DateTime(2020, 02, 12)}, // Eevee
{9006, new DateTime(2020, 02, 12)}, // Rotom
{9007, new DateTime(2020, 02, 12)}, // Pichu
{9008, new DateTime(2020, 06, 02)}, // Hidden Ability Grookey
{9009, new DateTime(2020, 06, 02)}, // Hidden Ability Scorbunny
{9010, new DateTime(2020, 06, 02)}, // Hidden Ability Sobble
{9011, new DateTime(2020, 06, 30)}, // Shiny Zeraora
{9012, new DateTime(2020, 11, 10)}, // Gigantamax Melmetal
{9013, new DateTime(2021, 06, 17)}, // Gigantamax Bulbasaur
{9014, new DateTime(2021, 06, 17)}, // Gigantamax Squirtle
};
private static readonly DateTime? Never = null;
///
/// Minimum date the gift can be received.
///
public static readonly Dictionary WA8Gifts = new()
{
{0138, (new(2022, 01, 27), new(2023, 02, 01))}, // Poké Center Happiny
{0301, (new(2022, 02, 04), new(2023, 03, 01))}, // プロポチャ Piplup
{0801, (new(2022, 02, 25), new(2022, 06, 01))}, // Teresa Roca Hisuian Growlithe
{1201, (new(2022, 05, 31), new(2022, 08, 01))}, // 전이마을 Regigigas
{1202, (new(2022, 05, 31), new(2022, 08, 01))}, // 빛나's Piplup
{1203, (new(2022, 08, 18), new(2022, 11, 01))}, // Arceus Chronicles Hisuian Growlithe
{0151, (new(2022, 09, 03), new(2022, 10, 01))}, // Otsukimi Festival 2022 Clefairy
{9018, (new(2022, 05, 18), Never)}, // Hidden Ability Rowlet
{9019, (new(2022, 05, 18), Never)}, // Hidden Ability Cyndaquil
{9020, (new(2022, 05, 18), Never)}, // Hidden Ability Oshawott
};
///
/// Minimum date the gift can be received.
///
public static readonly Dictionary WB8Gifts = new()
{
{9015, (new(2022, 05, 18), Never)}, // Hidden Ability Turtwig
{9016, (new(2022, 05, 18), Never)}, // Hidden Ability Chimchar
{9017, (new(2022, 05, 18), Never)}, // Hidden Ability Piplup
};
}