using Nonemm.Core; namespace Nonemm.Contests.Rules; /// IARU HF World Championship. The exchange is an ITU zone or, for a society /// headquarters station, its abbreviation; both count as multipliers per band. public sealed class IaruHf : Contest { public string Name => "IARU"; public string DisplayName => "IARU HF World Championship"; public string CabrilloName => "IARU-HF"; public IReadOnlyList ExchangeFieldsFor(StationInfo me) => [ new ExchangeField("RST", ExchangeSlot.ReceivedReport, ExchangeFieldKind.Report), new ExchangeField("Zone/HQ", ExchangeSlot.Exchange1, ExchangeFieldKind.Text) { Width = 6 }, ]; public IReadOnlyList MultiplierNames => ["Zones", "HQ"]; public DupeScope DupeScope => DupeScope.PerBandAndMode; public bool HasSerialNumbers => false; public IReadOnlyList Modes => [ModeCategory.Cw, ModeCategory.Phone]; public string SentExchangeFor(StationInfo me) => me.ItuZone.ToString(); public int PointsFor(QsoContext qso) { string exchange = Exchange(qso); if (!IsZone(exchange)) { return 1; } if (int.TryParse(exchange, out int zone) && zone == qso.Me.ItuZone) { return 1; } return qso.IsSameContinent ? 3 : 5; } public IReadOnlyList MultipliersFor(QsoContext qso) { string exchange = Exchange(qso); if (exchange.Length == 0) { return []; } string band = qso.Band?.Name ?? ""; return [new Multiplier(IsZone(exchange) ? 1 : 2, exchange, band)]; } public int TotalScore(ScoreTally tally) => tally.Points * tally.TotalMultipliers; public CabrilloExchange CabrilloExchange(Qso qso, StationInfo me) => new( [ new CabrilloField(me.Callsign, 13), new CabrilloField(qso.SentReport, 3), new CabrilloField(me.ItuZone.ToString(), 6), ], [ new CabrilloField(qso.Call.Text, 13), new CabrilloField(qso.ReceivedReport, 3), new CabrilloField(qso.Exchange1, 6), ]); private static string Exchange(QsoContext qso) => qso.Qso.Exchange1.Trim().ToUpperInvariant(); private static bool IsZone(string exchange) => exchange.Length > 0 && exchange.All(char.IsAsciiDigit); }