using ComPDFKit.PDFDocument;
using PDF_Master.Model;
using PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs;
using Prism.Services.Dialogs;
using System.Management;
using static PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs.SetPasswordDialogModel;
using static PDF_Master.Model.Dialog.ToolsDialogs.SaftyDialogs.DeleteSafetySettintgsModel;

namespace PDF_Master.Helper
{
    public class SecurityHelper
    {
        /// <summary>
        /// 由全局变量储存是否修改过密码
        /// </summary>
        public static bool IsPasswordChanged = false;
        /// <summary>
        /// 全局变量储存修改后的密码
        /// </summary>
        public static class PasswordInfo
        {
            public static string OpenPassword = null;
            public static string PermissionsPassword = null;
            public static CPDFPermissionsInfo CPDFPermissionsInfo = CreateDefaultPermissionsInfo();
        }

        public static bool CheckHaveAllPermissions(CPDFDocument document)
        {
            CPDFPermissionsInfo permissionsInfo = document.GetPermissionsInfo();
            if (permissionsInfo.AllowsDocumentChanges &&
                permissionsInfo.AllowsPrinting &&
                permissionsInfo.AllowsHighQualityPrinting &&
                permissionsInfo.AllowsCopying &&
                permissionsInfo.AllowsDocumentAssembly &&
                permissionsInfo.AllowsFormFieldEntry &&
                permissionsInfo.AllowsCommenting||string.IsNullOrEmpty(document.FilePath) )
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public static bool CheckHaveSelectedPermissions(CPDFDocument document, EnumPermissionsSet enumPermissionsSet)
        {
            CPDFPermissionsInfo permissionsInfo = document.GetPermissionsInfo();
            ///如果需求这个权限
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsDocumentChanges) == EnumPermissionsSet.StatusAllowsDocumentChanges) && (!permissionsInfo.AllowsDocumentChanges))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsPrinting) == EnumPermissionsSet.StatusAllowsPrinting) && (!permissionsInfo.AllowsPrinting))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsHighQualityPrinting) == EnumPermissionsSet.StatusAllowsHighQualityPrinting) && (!permissionsInfo.AllowsHighQualityPrinting))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsCopying) == EnumPermissionsSet.StatusAllowsCopying) && (!permissionsInfo.AllowsCopying))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsDocumentAssembly) == EnumPermissionsSet.StatusAllowsDocumentAssembly) && (!permissionsInfo.AllowsDocumentAssembly))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsFormFieldEntry) == EnumPermissionsSet.StatusAllowsFormFieldEntry) && (!permissionsInfo.AllowsDocumentAssembly))
            {
                return false;
            }
            if (((enumPermissionsSet & EnumPermissionsSet.StatusAllowsCommenting) == EnumPermissionsSet.StatusAllowsCommenting) && (!permissionsInfo.AllowsCommenting))
            {
                return false;
            }
            return true;
        }

        /// <summary>
        /// 该函数根据需要的密码类型进行验证
        /// </summary>
        /// <param name="document">文档对象</param>
        /// <param name="enumPasswordKind">密码类型枚举EnumPasswordKind</param>
        /// <param name="dialogService">该ViewModel的IDialogService对象</param>
        /// <returns>
        ///<para>
        ///返回值结构体状态:
        /// </para>
        /// <para>
        /// IsDiscryptied == true
        /// Password == null
        /// 已解锁且无需密码提权
        /// </para>
        /// <para>
        ///IsDiscryptied == true
        ///Password != null
        ///可解锁且密码存储在Password中
        /// </para>
        /// <para>
        /// IsDiscrypited == false
        /// 密码错误且不可解锁
        /// </para>
        /// </returns>
        public static VerifyPasswordResult VerifyPasswordByPasswordKind(CPDFDocument document, EnumPasswordKind enumPasswordKind, IDialogService dialogService)
        {

            VerifyPasswordResult verifyPasswordResult = new VerifyPasswordResult();
            if (document != null&& dialogService!=null)
            {
                if ((!document.IsLocked) &&
                ((enumPasswordKind == EnumPasswordKind.StatusOpenPassword) ||
                (enumPasswordKind == EnumPasswordKind.StatusPermissionsPassword) && CheckHaveAllPermissions(document)) || string.IsNullOrEmpty(document.FilePath))
                {
                    verifyPasswordResult.IsDiscryptied = true;
                    verifyPasswordResult.Password = null;
                    return verifyPasswordResult;
                }

                DialogParameters value = new DialogParameters();
                value.Add(ParameterNames.PasswordKind, enumPasswordKind);
                value.Add(ParameterNames.PDFDocument, document);
                dialogService.ShowDialog(DialogNames.CheckPasswordDialog, value, e =>
                {
                    verifyPasswordResult.IsDiscryptied = e.Parameters.GetValue<bool>(ParameterNames.PasswordResult);
                    verifyPasswordResult.Password = e.Parameters.GetValue<string>(ParameterNames.Password);
                });
            }
            return verifyPasswordResult;
        }

        /// <summary>
        /// 该函数根据需要的权限类型子集进行验证
        /// </summary>
        /// <param name="document">文档对象</param>
        /// <param name="enumPermissionsSet">权限类型枚举子集EnumPermissionsSet,当权限为空时退化到开启密码</param>
        /// <param name="dialogService">该ViewModel的IDialogService对象</param>
        /// <returns>
        ///<para>
        ///返回值结构体状态:
        /// </para>
        /// <para>
        /// IsDiscryptied == true
        /// Password == null
        /// 已解锁且无需密码提权
        /// </para>
        /// <para>
        ///IsDiscryptied == true
        ///Password != null
        ///可解锁且密码存储在Password中
        /// </para>
        /// <para>
        /// IsDiscrypited == false
        /// 密码错误且不可解锁
        /// </para>
        /// </returns>
        public static VerifyPasswordResult VerifyPasswordForSelectedPermissions(CPDFDocument document, EnumPermissionsSet enumPermissionsSet, IDialogService dialogService)
        {
            VerifyPasswordResult verifyPasswordResult = new VerifyPasswordResult();
            if ((!document.IsLocked) && CheckHaveSelectedPermissions(document, enumPermissionsSet))
            {
                verifyPasswordResult.IsDiscryptied = true;
                verifyPasswordResult.Password = null;
            }
            else
            {
                DialogParameters value = new DialogParameters();
                if (CheckHaveSelectedPermissions(document, enumPermissionsSet))
                {
                    value.Add(ParameterNames.PasswordKind, EnumPasswordKind.StatusOpenPassword);
                }
                else
                {
                    value.Add(ParameterNames.PasswordKind, EnumPasswordKind.StatusPermissionsPassword);
                }
                value.Add(ParameterNames.PDFDocument, document);
                dialogService.ShowDialog(DialogNames.CheckPasswordDialog, value, e =>
                {
                    verifyPasswordResult.IsDiscryptied = e.Parameters.GetValue<bool>(ParameterNames.PasswordResult);
                    verifyPasswordResult.Password = e.Parameters.GetValue<string>(ParameterNames.Password);
                });
            }
            return verifyPasswordResult;
        }
    }

    public class VerifyPasswordResult
    {
        public bool IsDiscryptied;
        public string Password;
    }
}