using System;

using JetBrains.Annotations;

namespace LinqToDB
{
	using DataProvider.DB2;
	using DataProvider.SqlServer;

	/// <summary>
	/// Default names for providers.
	/// </summary>
	[PublicAPI]
	public static class ProviderName
	{
		/// <summary>
		/// Microsoft Access OleDb provider (both JET or ACE).
		/// Used as configuration name for Access mapping schema <see cref="DataProvider.Access.AccessMappingSchema"/>.
		/// </summary>
		public const string Access        = "Access";

		/// <summary>
		/// Microsoft Access ODBC provider.
		/// Used as configuration name for Access mapping schema <see cref="DataProvider.Access.AccessMappingSchema"/>.
		/// </summary>
		public const string AccessOdbc    = "Access.Odbc";

		/// <summary>
		/// IBM DB2 default provider (DB2 LUW).
		/// Used as configuration name for both DB2 base mapping schema <see cref="DB2MappingSchema"/>.
		/// </summary>
		public const string DB2           = "DB2";
		/// <summary>
		/// IBM DB2 LUW provider.
		/// Used as configuration name for DB2 LUW mapping schema <see cref="DB2MappingSchema.DB2LUWMappingSchema"/>.
		/// </summary>
		public const string DB2LUW        = "DB2.LUW";
		/// <summary>
		/// IBM DB2 for z/OS provider.
		/// Used as configuration name for DB2 z/OS mapping schema <see cref="DB2MappingSchema.DB2zOSMappingSchema"/>.
		/// </summary>
		public const string DB2zOS        = "DB2.z/OS";
		/// <summary>
		/// Firebird provider.
		/// Used as configuration name for Firebird mapping schema <see cref="DataProvider.Firebird.FirebirdMappingSchema"/>.
		/// </summary>
		public const string Firebird      = "Firebird";
		/// <summary>
		/// Informix IBM.Data.Informix provider (including IDS provider).
		/// Used as configuration name for Informix mapping schema <see cref="DataProvider.Informix.InformixMappingSchema"/>.
		/// </summary>
		public const string Informix      = "Informix";
		/// <summary>
		/// Informix over IBM.Data.DB2 IDS provider.
		/// Used as configuration name for Informix mapping schema <see cref="DataProvider.Informix.InformixMappingSchema"/>.
		/// </summary>
		public const string InformixDB2   = "Informix.DB2";
		/// <summary>
		/// Microsoft SQL Server default provider (SQL Server 2008).
		/// Used as configuration name for SQL Server base mapping schema <see cref="SqlServerMappingSchema"/>.
		/// </summary>
		public const string SqlServer     = "SqlServer";
		/// <summary>
		/// Microsoft SQL Server 2005 provider.
		/// Used as configuration name for SQL Server 2005 mapping schema <see cref="SqlServerMappingSchema.SqlServer2005MappingSchema"/>.
		/// </summary>
		public const string SqlServer2005 = "SqlServer.2005";
		/// <summary>
		/// Microsoft SQL Server 2008 provider.
		/// Used as configuration name for SQL Server 2008 mapping schema <see cref="SqlServerMappingSchema.SqlServer2008MappingSchema"/>.
		/// </summary>
		public const string SqlServer2008 = "SqlServer.2008";
		/// <summary>
		/// Microsoft SQL Server 2012 provider.
		/// Used as configuration name for SQL Server 2012 mapping schema <see cref="SqlServerMappingSchema.SqlServer2012MappingSchema"/>.
		/// </summary>
		public const string SqlServer2012 = "SqlServer.2012";
		/// <summary>
		/// Microsoft SQL Server 2012 provider.
		/// </summary>
		public const string SqlServer2014 = "SqlServer.2014";
		/// <summary>
		/// Microsoft SQL Server 2016 provider.
		/// Used as configuration name for SQL Server 2016 mapping schema <see cref="SqlServerMappingSchema.SqlServer2016MappingSchema"/>.
		/// </summary>
		public const string SqlServer2016 = "SqlServer.2016";
		/// <summary>
		/// Microsoft SQL Server 2017 provider.
		/// Used as configuration name for SQL Server 2017 mapping schema <see cref="SqlServerMappingSchema.SqlServer2017MappingSchema"/>.
		/// </summary>
		public const string SqlServer2017 = "SqlServer.2017";
		/// <summary>
		/// Microsoft SQL Server 2019 provider.
		/// Used as configuration name for SQL Server 2019 mapping schema <see cref="SqlServerMappingSchema.SqlServer2019MappingSchema"/>.
		/// </summary>
		public const string SqlServer2019 = "SqlServer.2019";
		/// <summary>
		/// Microsoft SQL Server 2022 provider.
		/// Used as configuration name for SQL Server 2019 mapping schema <see cref="SqlServerMappingSchema.SqlServer2022MappingSchema"/>.
		/// </summary>
		public const string SqlServer2022 = "SqlServer.2022";
		/// <summary>
		/// MySql provider.
		/// Used as configuration name for MySql mapping schema <see cref="DataProvider.MySql.MySqlMappingSchema"/>.
		/// </summary>
		public const string MySql         = "MySql";
		/// <summary>
		/// MySql provider.
		/// Used as configuration name for MySql mapping schema <see cref="DataProvider.MySql.MySqlMappingSchema"/>.
		/// </summary>
		public const string MySqlOfficial = "MySql.Official";
		/// <summary>
		/// MySqlConnector provider.
		/// Used as configuration name for MySql mapping schema <see cref="DataProvider.MySql.MySqlMappingSchema"/>.
		/// </summary>
		public const string MySqlConnector = "MySqlConnector";
		/// <summary>
		/// MariaDB provider.
		/// Used as an additional configuration name for MySql mapping schema <see cref="DataProvider.MySql.MySqlMappingSchema"/>.
		/// </summary>
		public const string MariaDB       = "MariaDB";
		/// <summary>
		/// Oracle ODP.NET autodetected provider (native or managed).
		/// Used as configuration name for Oracle base mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema"/>.
		/// </summary>
		public const string Oracle        = "Oracle";
		/// <summary>
		/// Oracle (11g dialect) ODP.NET native provider.
		/// Used as configuration name for Oracle native provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.Native11MappingSchema"/>.
		/// </summary>
		public const string Oracle11Native = "Oracle.11.Native";
		/// <summary>
		/// Oracle (11g dialect) Devart provider.
		/// Used as configuration name for Oracle managed provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.Devart11MappingSchema"/>.
		/// </summary>
		public const string Oracle11Devart = "Oracle.11.Devart";
		/// <summary>
		/// Oracle (11g dialect) ODP.NET managed provider.
		/// Used as configuration name for Oracle managed provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.Managed11MappingSchema"/>.
		/// </summary>
		public const string Oracle11Managed = "Oracle.11.Managed";
		/// <summary>
		/// Oracle ODP.NET native provider.
		/// Used as configuration name for Oracle native provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.NativeMappingSchema"/>.
		/// </summary>
		public const string OracleNative  = "Oracle.Native";
		/// <summary>
		/// Oracle ODP.NET managed provider.
		/// Used as configuration name for Oracle managed provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.ManagedMappingSchema"/>.
		/// </summary>
		public const string OracleManaged = "Oracle.Managed";
		/// <summary>
		/// Oracle Devart provider.
		/// Used as configuration name for Oracle managed provider mapping schema <see cref="DataProvider.Oracle.OracleMappingSchema.DevartMappingSchema"/>.
		/// </summary>
		public const string OracleDevart = "Oracle.Devart";
		/// <summary>
		/// PostgreSQL 9.2- data provider.
		/// Used as configuration name for PostgreSQL mapping schema <see cref="DataProvider.PostgreSQL.PostgreSQLMappingSchema"/>.
		/// </summary>
		public const string PostgreSQL    = "PostgreSQL";
		/// <summary>
		/// PostgreSQL 9.2- data provider.
		/// </summary>
		public const string PostgreSQL92  = "PostgreSQL.9.2";
		/// <summary>
		/// PostgreSQL 9.3+ data provider.
		/// </summary>
		public const string PostgreSQL93  = "PostgreSQL.9.3";
		/// <summary>
		/// PostgreSQL 9.5+ data provider.
		/// </summary>
		public const string PostgreSQL95  = "PostgreSQL.9.5";
		/// <summary>
		/// PostgreSQL 15+ data provider.
		/// </summary>
		public const string PostgreSQL15 = "PostgreSQL.15";
		/// <summary>
		/// Microsoft SQL Server Compact Edition provider.
		/// Used as configuration name for SQL CE mapping schema <see cref="DataProvider.SqlCe.SqlCeMappingSchema"/>.
		/// </summary>
		public const string SqlCe         = "SqlCe";
		/// <summary>
		/// SQLite provider.
		/// Used as configuration name for SQLite mapping schema <see cref="DataProvider.SQLite.SQLiteMappingSchema"/>.
		/// </summary>
		public const string SQLite        = "SQLite";
		/// <summary>
		/// System.Data.Sqlite provider.
		/// </summary>
		public const string SQLiteClassic = "SQLite.Classic";
		/// <summary>
		/// Microsoft.Data.Sqlite provider.
		/// </summary>
		public const string SQLiteMS      = "SQLite.MS";
		/// <summary>
		/// Native SAP/Sybase ASE provider.
		/// Used as configuration name for Sybase ASE mapping schema <see cref="DataProvider.Sybase.SybaseMappingSchema.NativeMappingSchema"/>.
		/// </summary>
		public const string Sybase        = "Sybase";
		/// <summary>
		/// Managed Sybase/SAP ASE provider from <a href="https://github.com/DataAction/AdoNetCore.AseClient">DataAction</a>.
		/// Used as configuration name for Sybase ASE mapping schema <see cref="DataProvider.Sybase.SybaseMappingSchema.ManagedMappingSchema"/>.
		/// </summary>
		public const string SybaseManaged = "Sybase.Managed";
		/// <summary>
		/// SAP HANA provider.
		/// Used as configuration name for SAP HANA mapping schema <see cref="DataProvider.SapHana.SapHanaMappingSchema"/>.
		/// </summary>
		public const string SapHana       = "SapHana";
		/// <summary>
		/// SAP HANA provider.
		/// Used as configuration name for SAP HANA mapping schema <see cref="DataProvider.SapHana.SapHanaMappingSchema.NativeMappingSchema"/>.
		/// </summary>
		public const string SapHanaNative = "SapHana.Native";
		/// <summary>
		/// SAP HANA ODBC provider.
		/// Used as configuration name for SAP HANA mapping schema <see cref="DataProvider.SapHana.SapHanaMappingSchema.OdbcMappingSchema"/>.
		/// </summary>
		public const string SapHanaOdbc   = "SapHana.Odbc";
		/// <summary>
		/// ClickHouse provider base name.
		/// </summary>
		public const string ClickHouse        = "ClickHouse";
		/// <summary>
		/// ClickHouse provider using Octonica.ClickHouseClient ADO.NET provider.
		/// </summary>
		public const string ClickHouseOctonica = "ClickHouse.Octonica";
		/// <summary>
		/// ClickHouse provider using ClickHouse.Client ADO.NET provider.
		/// </summary>
		public const string ClickHouseClient   = "ClickHouse.Client";
		/// <summary>
		/// ClickHouse provider using MySqlConnector ADO.NET provider.
		/// </summary>
		public const string ClickHouseMySql   = "ClickHouse.MySql";
	}
}
