using Newtonsoft.Json.Linq;

namespace EDPlayerJournal.Entries;

public class LocationEntry : Entry {
    /// <summary>
    /// Current star system.
    /// </summary>
    public string? StarSystem { get; set; }

    /// <summary>
    /// Faction in control of the current star system. Empty for unpopulated
    /// systems.
    /// </summary>
    public string? SystemFaction { get; set; }

    /// <summary>
    /// 64bit system address.
    /// </summary>
    public ulong SystemAddress { get; set; }

    /// <summary>
    /// Station name if docked at a station.
    /// </summary>
    public string? StationName { get; set; }

    /// <summary>
    /// Faction in control of the current station, if docked.
    /// </summary>
    public string? StationFaction { get; set; }

    /// <summary>
    /// Body within the system, might be null.
    /// </summary>
    public string? Body { get; set; }

    /// <summary>
    /// Returns true if the player is docked somewhere.
    /// </summary>
    public bool Docked { get; set; }

    /// <summary>
    /// Position of the star system.
    /// </summary>
    public long[]? StarPos { get; set; }

    public List<Faction> SystemFactions { get; set; } = new List<Faction>();

    protected override void Initialise() {
        StarSystem = JSON.Value<string>("StarSystem") ?? "";
        SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0;
        Docked = JSON.Value<bool?>("Docked") ?? false;
        StationName = JSON.Value<string>("StationName") ?? "";

        var pos = JSON.Value<JArray>("StarPos");
        if (pos != null) {
            StarPos = pos.ToObject<long[]>();
        }

        JObject? systemfaction = JSON.Value<JObject>("SystemFaction");
        if (systemfaction != null) {
            SystemFaction = systemfaction.Value<string>("Name");
        }

        JObject? stationfaction = JSON.Value<JObject>("StationFaction");
        if (stationfaction != null) {
            StationFaction = stationfaction.Value<string>("Name");
        }

        JArray? factions = JSON.Value<JArray>("Factions");
        if (factions != null) {
            foreach (JObject system_faction in factions) {
                Faction? f = Faction.FromJSON(system_faction);
                if (f != null) {
                    SystemFactions.Add(f);
                }
            }
        }
    }
}