//
//  NostaleDataFilesManager.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Diagnostics.CodeAnalysis;
using NosSmooth.Data.Abstractions;
using NosSmooth.Data.Abstractions.Language;
using Remora.Results;
namespace NosSmooth.Data.NOSFiles;
/// 
/// Nostale .NOS files manager.
/// 
public class NostaleDataFilesManager
{
    private readonly NostaleDataParser _parser;
    private ILanguageService? _languageService;
    private IInfoService? _infoService;
    /// 
    /// Initializes a new instance of the  class.
    /// 
    /// The parser.
    public NostaleDataFilesManager(NostaleDataParser parser)
    {
        _parser = parser;
    }
    /// 
    /// Gets the language service.
    /// 
    public ILanguageService LanguageService
    {
        get
        {
            if (_languageService is null)
            {
                throw new InvalidOperationException
                    ("The language service is null, did you forget to call NostaleDataManager.Initialize?");
            }
            return _languageService;
        }
    }
    /// 
    /// Gets the info service.
    /// 
    public IInfoService InfoService
    {
        get
        {
            if (_infoService is null)
            {
                throw new InvalidOperationException
                    ("The info service is null, did you forget to call NostaleDataManager.Initialize?");
            }
            return _infoService;
        }
    }
    /// 
    /// Initialize the info and language services.
    /// 
    /// A result that may or may not have succeeded.
    public Result Initialize()
    {
        if (_languageService is null)
        {
            var languageServiceResult = _parser.CreateLanguageService();
            if (!languageServiceResult.IsSuccess)
            {
                return Result.FromError(languageServiceResult);
            }
            _languageService = languageServiceResult.Entity;
        }
        if (_infoService is null)
        {
            var infoServiceResult = _parser.CreateInfoService();
            if (!infoServiceResult.IsSuccess)
            {
                return Result.FromError(infoServiceResult);
            }
            _infoService = infoServiceResult.Entity;
        }
        return Result.FromSuccess();
    }
}