using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AR.FTPClient
{
    /// 
    ///     ''' Stores a list of files and directories from an FTP result
    ///     ''' 
    ///     ''' 
    public class FTPdirectory : List
    {
        public FTPdirectory()
        {
        }
        /// 
        ///         ''' Constructor: create list from a (detailed) directory string
        ///         ''' 
        ///         ''' directory listing string
        ///         ''' 
        ///         ''' 
        public FTPdirectory(string dir, string path)
        {
            var lines = dir.Replace("\n","").Split('\r');
            foreach (var line in lines)
            {
                if (line != "")
                    this.Add(new FTPfileInfo(line, path));
            }
        }
       
        /// 
        ///         ''' Filter out only files from directory listing
        ///         ''' 
        ///         ''' optional file extension filter
        ///         ''' FTPdirectory listing
        public FTPdirectory GetFiles(string ext = "")
        {
            return this.GetFileOrDir(FTPfileInfo.DirectoryEntryTypes.File, ext);
        }
        /// 
        ///         ''' Returns a list of only subdirectories
        ///         ''' 
        ///         ''' FTPDirectory list
        ///         ''' 
        public FTPdirectory GetDirectories()
        {
            return this.GetFileOrDir(FTPfileInfo.DirectoryEntryTypes.Directory);
        }
        // internal: share use function for GetDirectories/Files
        private FTPdirectory GetFileOrDir(FTPfileInfo.DirectoryEntryTypes type, string ext = "")
        {
            FTPdirectory result = new FTPdirectory();
            foreach (FTPfileInfo fi in this)
            {
                if (fi.FileType == type)
                {
                    if (ext == "")
                        result.Add(fi);
                    else if (ext == fi.Extension)
                        result.Add(fi);
                }
            }
            return result;
        }
        public bool FileExists(string filename)
        {
            foreach (FTPfileInfo ftpfile in this)
            {
                if (ftpfile.Filename == filename)
                    return true;
            }
            return false;
        }
        private const char slash = '/';
        public static string GetParentDirectory(string dir)
        {
            string tmp = dir.TrimEnd(slash);
            int i = tmp.LastIndexOf(slash);
            if (i > 0)
                return tmp.Substring(0, i - 1);
            else
                throw new ApplicationException("No parent for root");
        }
    }
}