using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;
using pkNX.Randomization;
using pkNX.Structures;

namespace pkNX.WinForms;

[Serializable]
public class SharedSettings
{
    public PersonalRandSettings Personal { get; set; } = new();
    public SpeciesSettings Species { get; set; } = new();
    public TrainerRandSettings Trainer { get; set; } = new();
    public MovesetRandSettings Move { get; set; } = new();
    public LearnSettings Learn { get; set; } = new();
}

public static class EditUtil
{
    public static SharedSettings Settings { get; set; } = new();

    public static void LoadSettings(GameVersion game)
    {
        string path = GetSettingsFileName(game);
        if (!File.Exists(path))
        {
            Settings = new SharedSettings();
            return;
        }

        using var file = File.OpenRead(path);
        var reader = new XmlSerializer(typeof(SharedSettings));
        try
        {
            Settings = (SharedSettings?) reader.Deserialize(file) ?? new SharedSettings();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.Message);
        }
    }

    public static void SaveSettings(GameVersion game)
    {
        string path = GetSettingsFileName(game);
        using var file = File.Create(path);
        var writer = new XmlSerializer(typeof(SharedSettings));
        try
        {
            writer.Serialize(file, Settings);
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.Message);
            if (!File.Exists(path))
                return;
            file.Close();
            File.Delete(path);
        }
    }

    private static string GetSettingsFileName(GameVersion game)
    {
        var path = Path.GetDirectoryName(Application.StartupPath);
        if (path is null)
            throw new ArgumentNullException(nameof(path));
        return Path.Combine(path, $"randsetting{game}.xml");
    }
}
