using System;
using System.IO;

namespace Ryujinx
{
    class VirtualFs : IDisposable
    {
        private const string BasePath   = "Fs";
        private const string SavesPath  = "Saves";
        private const string SdCardPath = "SdCard";

        public Stream RomFs { get; private set; }

        public void LoadRomFs(string FileName)
        {
            RomFs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
        }

        public string GetFullPath(string BasePath, string FileName)
        {
            if (FileName.StartsWith('/'))
            {
                FileName = FileName.Substring(1);
            }

            string FullPath = Path.GetFullPath(Path.Combine(BasePath, FileName));

            if (!FullPath.StartsWith(GetBasePath()))
            {
                return null;
            }

            return FullPath;
        }

        public string GetSdCardPath() => MakeDirAndGetFullPath(SdCardPath);

        public string GetGameSavesPath() => MakeDirAndGetFullPath(SavesPath);

        private string MakeDirAndGetFullPath(string Dir)
        {
            string FullPath = Path.Combine(GetBasePath(), Dir);

            if (!Directory.Exists(FullPath))
            {
                Directory.CreateDirectory(FullPath);
            }

            return FullPath;
        }

        public string GetBasePath()
        {
            return Path.Combine(Directory.GetCurrentDirectory(), BasePath);
        }

        public void Dispose()
        {
            Dispose(true);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing && RomFs != null)
            {
                RomFs.Dispose();
            }
        }
    }
}