namespace DSInternals.PowerShell.Commands
{
    using System;
    using System.ComponentModel;
    using System.Management.Automation;
    using System.Security;
    using DSInternals.Common;
    using DSInternals.Common.Interop;
    using DSInternals.Common.Cryptography;

    [Cmdlet(VerbsData.ConvertTo, "LMHash")]
    [OutputType(new Type[] { typeof(string) })]
    public class ConvertToLMHashCommand : PSCmdlet
    {
        #region Parameters

        [Parameter(
            Mandatory = true,
            Position = 0,
            ValueFromPipeline = true,
            HelpMessage = "Provide a password in the form of a SecureString."
        )]
        [Alias("p")]
        [ValidatePasswordLength(0, 14)]
        public SecureString Password
        {
            get;
            set;
        }

        #endregion Parameters

        #region Cmdlet Overrides

        protected override void ProcessRecord()
        {
            // TODO: Extract as resource
            WriteVerbose("Calculating LM hash.");
            try
            {
                byte[] hashBytes = LMHash.ComputeHash(this.Password);
                string hashHex = hashBytes.ToHex();
                this.WriteObject(hashHex);
            }
            catch (ArgumentException ex)
            {
                ErrorRecord error = new ErrorRecord(ex, "Error1", ErrorCategory.InvalidArgument, this.Password);
                this.WriteError(error);
            }
            catch (Win32Exception ex)
            {
                // TODO: Handle password length.
                ErrorCategory category = ((Win32ErrorCode)ex.NativeErrorCode).ToPSCategory();
                ErrorRecord error = new ErrorRecord(ex, "Error2", category, this.Password);
                // Allow the processing to continue on this error:
                this.WriteError(error);
            }
            catch (Exception ex)
            {
                ErrorRecord error = new ErrorRecord(ex, "Error3", ErrorCategory.NotSpecified, this.Password);
                this.WriteError(error);
            }
        }

        #endregion Cmdlet Overrides
    }
}