/*
  KeePass Password Safe - The Open-Source Password Manager
  Copyright (C) 2003-2025 Dominik Reichl <dominik.reichl@t-online.de>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

using System;

namespace KeePassLib
{
	/// <summary>
	/// Compression algorithm specifiers.
	/// </summary>
	public enum PwCompressionAlgorithm
	{
		/// <summary>
		/// No compression.
		/// </summary>
		None = 0,

		/// <summary>
		/// GZip compression.
		/// </summary>
		GZip = 1,

		/// <summary>
		/// Virtual field: currently known number of algorithms. Should not be used
		/// by plugins or libraries -- it's used internally only.
		/// </summary>
		Count = 2
	}

	/// <summary>
	/// Tree traversal methods.
	/// </summary>
	public enum TraversalMethod
	{
		/// <summary>
		/// Don't traverse the tree.
		/// </summary>
		None = 0,

		/// <summary>
		/// Traverse the tree in pre-order mode, i.e. first visit all items
		/// in the current node, then visit all subnodes.
		/// </summary>
		PreOrder = 1
	}

	/// <summary>
	/// Methods for merging databases/entries.
	/// </summary>
	public enum PwMergeMethod
	{
		// Do not change the explicitly assigned values, otherwise
		// serialization (e.g. of Ecas triggers) breaks
		None = 0,
		OverwriteExisting = 1,
		KeepExisting = 2,
		OverwriteIfNewer = 3,
		CreateNewUuids = 4,
		Synchronize = 5
	}

	/// <summary>
	/// Icon identifiers for groups and password entries.
	/// </summary>
	public enum PwIcon
	{
		Key = 0,
		World,
		Warning,
		NetworkServer,
		MarkedDirectory,
		UserCommunication,
		Parts,
		Notepad,
		WorldSocket,
		Identity,
		PaperReady,
		Digicam,
		IRCommunication,
		MultiKeys,
		Energy,
		Scanner,
		WorldStar,
		CDRom,
		Monitor,
		EMail,
		Configuration,
		ClipboardReady,
		PaperNew,
		Screen,
		EnergyCareful,
		EMailBox,
		Disk,
		Drive,
		PaperQ,
		TerminalEncrypted,
		Console,
		Printer,
		ProgramIcons,
		Run,
		Settings,
		WorldComputer,
		Archive,
		Homebanking,
		DriveWindows,
		Clock,
		EMailSearch,
		PaperFlag,
		Memory,
		TrashBin,
		Note,
		Expired,
		Info,
		Package,
		Folder,
		FolderOpen,
		FolderPackage,
		LockOpen,
		PaperLocked,
		Checked,
		Pen,
		Thumbnail,
		Book,
		List,
		UserKey,
		Tool,
		Home,
		Star,
		Tux,
		Feather,
		Apple,
		Wiki,
		Money,
		Certificate,
		BlackBerry,

		/// <summary>
		/// Virtual identifier -- represents the number of icons.
		/// </summary>
		Count
	}

	public enum ProxyServerType
	{
		None = 0,
		System = 1,
		Manual = 2
	}

	public enum ProxyAuthType
	{
		None = 0,

		/// <summary>
		/// Use default user credentials (provided by the system).
		/// </summary>
		Default = 1,

		Manual = 2,

		/// <summary>
		/// <c>Default</c> or <c>Manual</c>, depending on whether
		/// manual credentials are available.
		/// This type exists for supporting upgrading from KeePass
		/// 2.28 to 2.29; the user cannot select this type.
		/// </summary>
		Auto = 3
	}

	/// <summary>
	/// Comparison modes for in-memory protected objects.
	/// </summary>
	public enum MemProtCmpMode
	{
		/// <summary>
		/// Ignore the in-memory protection states.
		/// </summary>
		None = 0,

		/// <summary>
		/// Ignore the in-memory protection states of standard
		/// objects; do compare in-memory protection states of
		/// custom objects.
		/// </summary>
		CustomOnly,

		/// <summary>
		/// Compare in-memory protection states.
		/// </summary>
		Full
	}

	[Flags]
	public enum PwCompareOptions
	{
		None = 0x0,

		/// <summary>
		/// Empty standard string fields are considered to be the
		/// same as non-existing standard string fields.
		/// This doesn't affect custom string comparisons.
		/// </summary>
		NullEmptyEquivStd = 0x1,

		IgnoreParentGroup = 0x2,
		IgnoreLastAccess = 0x4,
		IgnoreLastMod = 0x8,
		IgnoreHistory = 0x10,
		IgnoreLastBackup = 0x20,

		// For groups:
		PropertiesOnly = 0x40,

		IgnoreTimes = (IgnoreLastAccess | IgnoreLastMod)
	}

	public enum IOAccessType
	{
		None = 0,

		/// <summary>
		/// The I/O connection is being opened for reading.
		/// </summary>
		Read = 1,

		/// <summary>
		/// The I/O connection is being opened for writing.
		/// </summary>
		Write = 2,

		/// <summary>
		/// The I/O connection is being opened for testing
		/// whether a file/object exists.
		/// </summary>
		Exists = 3,

		/// <summary>
		/// The I/O connection is being opened for deleting a file/object.
		/// </summary>
		Delete = 4,

		/// <summary>
		/// The I/O connection is being opened for renaming/moving a file/object.
		/// </summary>
		Move = 5
	}

	// public enum PwLogicalOp
	// {
	//	None = 0,
	//	Or = 1,
	//	And = 2,
	//	NOr = 3,
	//	NAnd = 4
	// }

	[Flags]
	public enum AppRunFlags
	{
		None = 0,
		GetStdOutput = 1,
		WaitForExit = 2,

		// https://sourceforge.net/p/keepass/patches/84/
		/// <summary>
		/// This flag prevents any handles being garbage-collected
		/// before the started process has terminated, without
		/// blocking the current thread.
		/// </summary>
		GCKeepAlive = 4,

		// https://sourceforge.net/p/keepass/patches/85/
		DoEvents = 8,
		DisableForms = 16
	}

	[Flags]
	public enum ScaleTransformFlags
	{
		None = 0,

		/// <summary>
		/// <c>UIIcon</c> indicates that the returned image is going
		/// to be displayed as icon in the UI and that it is not
		/// subject to future changes in size.
		/// </summary>
		UIIcon = 1
	}

	// Cf. System.Runtime.InteropServices.Architecture (since .NET 4.7.1).
	internal enum ArchitectureEx
	{
		/// <summary>Unknown processor architecture.</summary>
		None = 0,
		/// <summary>32-bit x86 (x86-32).</summary>
		X86,
		/// <summary>64-bit x86 (x86-64).</summary>
		X64,
		/// <summary>32-bit ARM (ARM32).</summary>
		Arm,
		/// <summary>64-bit ARM (ARM64).</summary>
		Arm64
	}

	public enum DesktopType
	{
		None = 0,
		Windows,
		Gnome,
		Kde,
		Unity,
		Lxde,
		Xfce,
		Mate,
		Cinnamon,
		Pantheon
	}

	public enum PwSearchMode
	{
		None = 0,
		Simple,
		Regular,
		XPath
	}
}
