using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using EDPlayerJournal.BGS;

namespace EliteBGS;

public class SystemObjectives : INotifyPropertyChanged, IComparable<SystemObjectives> {
    public event PropertyChangedEventHandler PropertyChanged;

    private bool isenabled = true;

    public bool IsEnabled {
        get { return isenabled; }
        set {
            isenabled = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsEnabled"));
        } 
    }

    public bool IsExpanded { get; set; } = false;

    public string SystemName { get; set; } = string.Empty;

    public List<Objective> Objectives { get; set; } = new();

    public int CompareTo(SystemObjectives other) {
        if (other == null) return 1;
        return string.Compare(SystemName, other.SystemName, StringComparison.OrdinalIgnoreCase);
    }
}

public class Report {
    public List<SystemObjectives> SystemObjectives { get; set; } = new();

    public Report() { }

    public Report(List<Transaction> transactions) {
        Populate(transactions);
    }

    public List<Objective> Objectives {
        get {
            return SystemObjectives
                .Where(t => t.IsEnabled)
                .SelectMany(x => x.Objectives)
                .ToList()
                ;
        }
    }

    private void Populate(List<Transaction> transactions) {
        if (transactions == null || transactions.Count == 0) {
            return;
        }

        foreach (Transaction t in transactions) {
            var o = SystemObjectives.Find(x => string.Compare(x.SystemName, t.System) == 0);
            if (o == null) {
                o = new SystemObjectives() { SystemName = t.System };
                SystemObjectives.Add(o);
            }
            var objective = o.Objectives.Find(x => x.Matches(t.System, t.Faction));
            if (objective == null) {
                objective = new Objective() { Faction = t.Faction, System = t.System };
                o.Objectives.Add(objective);
            }
            objective.UITransactions.Add(new UITransaction(t));
        }

        SystemObjectives.Sort();
    }
}