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

namespace Security2
{
    public class FileSystemOwner
    {
        private FileSystemInfo item;
        private IdentityReference2 owner;
        private FileSystemSecurity sd;

        public FileSystemInfo Item
        {
            get { return item; }
        }

        public IdentityReference2 Owner
        {
            get { return owner; }
        }

        private FileSystemOwner(FileSystemInfo item, IdentityReference2 owner)
        {
            this.item = item;
            this.owner = owner;
        }

        public static FileSystemOwner GetOwner(FileSystemSecurity2 sd)
        {
            return new FileSystemOwner(sd.Item, sd.SecurityDescriptor.GetOwner(typeof(SecurityIdentifier)));
        }

        public static void SetOwner(FileSystemSecurity2 sd, IdentityReference2 account)
        {
            sd.SecurityDescriptor.SetOwner(account);
        }

        public static FileSystemOwner GetOwner(FileSystemInfo item)
        {
            return GetOwner(new FileSystemSecurity2(item, AccessControlSections.Owner));
        }

        public static void SetOwner(FileSystemInfo item, IdentityReference2 account)
        {
            var sd = new FileSystemSecurity2(item, AccessControlSections.Owner);

            SetOwner(sd, account);

            sd.Write();
        }

        public override string ToString()
        {
            return item.FullName;
        }
    }
}
