using Alphaleonis.Win32.Filesystem;
using System.Security.AccessControl;

namespace Security2
{
    public partial class FileSystemAccessRule2
    {
        #region Properties
        private FileSystemAccessRule fileSystemAccessRule;
        private string fullName;
        private bool inheritanceEnabled;
        private string inheritedFrom;

        public string Name { get { return System.IO.Path.GetFileName(fullName); } }
        public string FullName { get { return fullName; } set { fullName = value; } }
        public bool InheritanceEnabled { get { return inheritanceEnabled; } set { inheritanceEnabled = value; } }
        public string InheritedFrom { get { return inheritedFrom; } set { inheritedFrom = value; } }
        public AccessControlType AccessControlType { get { return fileSystemAccessRule.AccessControlType; } }
        public FileSystemRights2 AccessRights { get { return (FileSystemRights2)fileSystemAccessRule.FileSystemRights; } }
        public IdentityReference2 Account { get { return fileSystemAccessRule.IdentityReference; } }
        public InheritanceFlags InheritanceFlags { get { return fileSystemAccessRule.InheritanceFlags; } }
        public bool IsInherited { get { return fileSystemAccessRule.IsInherited; } }
        public PropagationFlags PropagationFlags { get { return fileSystemAccessRule.PropagationFlags; } }
        #endregion

        public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule)
        {
            this.fileSystemAccessRule = fileSystemAccessRule;
        }

        public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule, FileSystemInfo item)
        {
            this.fileSystemAccessRule = fileSystemAccessRule;
            this.fullName = item.FullName;
        }

        public FileSystemAccessRule2(FileSystemAccessRule fileSystemAccessRule, string path)
        {
            this.fileSystemAccessRule = fileSystemAccessRule;
        }

        public static implicit operator FileSystemAccessRule(FileSystemAccessRule2 ace2)
        {
            return ace2.fileSystemAccessRule;
        }
        public static implicit operator FileSystemAccessRule2(FileSystemAccessRule ace)
        {
            return new FileSystemAccessRule2(ace);
        }

        //REQUIRED BECAUSE OF CONVERSION OPERATORS
        public override bool Equals(object obj)
        {
            return fileSystemAccessRule == (FileSystemAccessRule)obj;
        }
        public override int GetHashCode()
        {
            return fileSystemAccessRule.GetHashCode();
        }
        public override string ToString()
        {
            return string.Format("{0} '{1}' ({2})",
                AccessControlType.ToString()[0],
                Account.AccountName,
                AccessRights.ToString()
            );

        }
        public SimpleFileSystemAccessRule ToSimpleFileSystemAccessRule2()
        {
            return new SimpleFileSystemAccessRule(fullName, Account, AccessRights);
        }
    }
}