namespace DSInternals.PowerShell.Commands
{
    using System;
    using System.Management.Automation;

    public abstract class ADDBModifyPrincipalCommandBase : ADDBPrincipalCommandBase
    {
        [Parameter(Mandatory = false)]
        [Alias("SkipMeta", "NoMetaUpdate", "NoMeta", "SkipObjMeta", "NoObjMeta", "SkipMetaDataUpdate", "NoMetaDataUpdate")]
        public SwitchParameter SkipMetaUpdate
        {
            get;
            set;
        }

        [Parameter]
        public SwitchParameter Force
        {
            get;
            set;
        }

        protected override bool ReadOnly
        {
            get
            {
                return false;
            }
        }

        protected override void BeginProcessing()
        {
            if (!Force.IsPresent)
            {
                // Do not continue with the operation until the user enforces it.
                var exception = new ArgumentException("This command physically modifies the database, which is not supported by Microsoft. Use at your own risk after performing a proper AD backup. To suppress this warning, reissue the command specifying the Force parameter.");
                var error = new ErrorRecord(exception, "ModifyPrincipal_ForceRequired", ErrorCategory.InvalidArgument, null);
                this.ThrowTerminatingError(error);
            }

            base.BeginProcessing();
        }

        protected void WriteVerboseResult(bool hasChanged)
        {
            if (hasChanged)
            {
                // TODO: Extract as resource:
                this.WriteVerbose("The object has been updated successfully.");
            }
            else
            {
                // TODO: Extract as resource:
                this.WriteVerbose("The object already contained the value to be added.");
            }
        }
    }
}