﻿using System;
using System.Data.Common;
 

namespace Apache.IoTDB.Data
{
    /// <summary>
    ///     Represents a IoTDB error.
    /// </summary>
    public class IoTDBException : DbException
    {
        IoTDBErrorResult _IoTDBError;

        public IoTDBException(IoTDBErrorResult IoTDBError) : base(IoTDBError.Error, null)
        {
            _IoTDBError = IoTDBError;
            base.HResult = _IoTDBError.Code;
        }

        public IoTDBException(IoTDBErrorResult IoTDBError, Exception ex) : base(IoTDBError.Error, ex)
        {
            _IoTDBError = IoTDBError;
            base.HResult = _IoTDBError.Code;
        }


   

      
        public override string Message => _IoTDBError?.Error;
        public override int ErrorCode =>   (int) _IoTDBError?.Code;
        /// <summary>
        ///     Throws an exception with a specific IoTDB error code value.
        /// </summary>
        /// <param name="rc">The IoTDB error code corresponding to the desired exception.</param>
        /// <param name="db">A handle to database connection.</param>
        /// <remarks>
        ///     No exception is thrown for non-error result codes.
        /// </remarks>
        public static void ThrowExceptionForRC(string _commandText, IoTDBErrorResult IoTDBError)
        {
            var te = new IoTDBException(IoTDBError);
            te.Data.Add("commandText", _commandText);
            throw te;
        }
        public static void ThrowExceptionForRC( IoTDBErrorResult IoTDBError)
        {
            var te = new IoTDBException(IoTDBError);
            throw te;
        }
        public static void ThrowExceptionForRC(IntPtr _IoTDB)
        {
            var te = new IoTDBException(new IoTDBErrorResult() {   });
            throw te;
        }
        public static void ThrowExceptionForRC(int code, string message, Exception ex)
        {
            var te = new IoTDBException(new IoTDBErrorResult() { Code = code, Error = message }, ex);
            throw te;
        }
        public static void ThrowExceptionForRC(int code, string message)
        {
            var te = new IoTDBException(new IoTDBErrorResult() { Code = code, Error = message });
            throw te;
        }
    }
}
