using System;
using System.IO;
using System.Linq;
using Yavsc.Abstract.FileSystem;
using Yavsc.Helpers;

namespace Yavsc.ViewModels.UserFiles
{
    public class UserDirectoryInfo
    {
        public string UserName { get; set; }
        public string SubPath { get; set; }
        public RemoteFileInfo [] Files {
            get; set;
        }
        public DirectoryShortInfo [] SubDirectories { 
            get; set;
        }
        private DirectoryInfo dInfo;

        // for deserialization
        public UserDirectoryInfo()
        {

        }
        public UserDirectoryInfo(string userReposPath, string username, string path)
        {
            if (string.IsNullOrWhiteSpace(username))
                throw new NotSupportedException("No user name, no user dir.");
            UserName = username;
            var finalPath = path == null ? username : Path.Combine(username, path);
            if (!finalPath.IsValidYavscPath())
                throw new InvalidOperationException(
                    $"File name contains invalid chars ({finalPath})");

            dInfo = new DirectoryInfo(
                userReposPath+Path.DirectorySeparatorChar+finalPath);
            if (dInfo.Exists) {

                Files = dInfo.GetFiles().Select
                    ( entry => new RemoteFileInfo { Name = entry.Name, Size = entry.Length,
                    CreationTime = entry.CreationTime, LastModified = entry.LastWriteTime  }).ToArray();
                SubDirectories = dInfo.GetDirectories().Select
                    ( d=> new DirectoryShortInfo { Name= d.Name, IsEmpty=false } ).ToArray();
            }
            else {
                // don't return null, but empty arrays
                Files = new RemoteFileInfo[0];
                SubDirectories = new DirectoryShortInfo[0];
            }
        }
    }
}
