/// <summary>
        /// Add Kiroku log event.
        /// </summary>
        /// <param name="record"></param>
        /// <param name="instanceId"></param>
        /// <returns></returns>
        public static SQLResponseModel AddLog(LogRecordModel record, Guid instanceId)
        {
            SQLResponseModel response = new SQLResponseModel();

            try
            {
                using (var connection = new SqlConnection(Configuration.SqlConnetionString))
                {
                    var cmd = new SqlCommand("usp_Kiroku_KLogs_InsertAdd", connection);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("dt_session", record.EventTime);
                    cmd.Parameters.AddWithValue("dt_event", record.EventTime);
                    cmd.Parameters.AddWithValue("ui_blockid", record.BlockID);
                    cmd.Parameters.AddWithValue("nvc_blockname", record.BlockName);
                    cmd.Parameters.AddWithValue("nvc_logtype", record.LogType);
                    cmd.Parameters.AddWithValue("nvc_logdata", record.LogData);

                    connection.Open();

                    var reader = cmd.ExecuteReader();

                    response.Successful();

                    return(response);
                }
            }
            catch (Exception ex)
            {
                response.Failure(ex.ToString());

                return(response);
            }
        }
        /// <summary>
        /// Add Kiroku Block pair.
        /// </summary>
        /// <param name="logRecord"></param>
        /// <param name="startRecord"></param>
        /// <param name="instanceId"></param>
        /// <returns></returns>
        public static SQLResponseModel AddBlock(LogRecordModel logRecord, LogRecordModel startRecord, Guid instanceId)
        {
            SQLResponseModel response = new SQLResponseModel();

            try
            {
                using (var connection = new SqlConnection(Configuration.SqlConnetionString))
                {
                    var cmd = new SqlCommand("usp_Kiroku_KBlocks_InsertBlock", connection);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("ui_instanceid", instanceId);
                    cmd.Parameters.AddWithValue("ui_blockid", logRecord.BlockID);
                    cmd.Parameters.AddWithValue("nvc_blockname", logRecord.BlockName);
                    cmd.Parameters.AddWithValue("dt_blockstart", startRecord.EventTime);
                    cmd.Parameters.AddWithValue("dt_blockstop", logRecord.EventTime);

                    connection.Open();

                    var reader = cmd.ExecuteReader();

                    response.Successful();

                    return(response);
                }
            }
            catch (Exception ex)
            {
                response.Failure(ex.ToString());

                return(response);
            }
        }
        /// <summary>
        /// Check if Kiroku logging Instance already exist in database.
        /// </summary>
        /// <param name="instanceId"></param>
        /// <returns></returns>
        public static SQLResponseModel CheckInstanceId(Guid instanceId)
        {
            SQLResponseModel response = new SQLResponseModel();
            Guid             check    = new Guid();

            try
            {
                using (var connection = new SqlConnection(Configuration.SqlConnetionString))
                {
                    var cmd = new SqlCommand("usp_Kiroku_KInstances_SelectCheck", connection);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("ui_instanceid", instanceId.ToString());

                    connection.Open();

                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        check = (Guid)reader["ui_instanceid"];
                    }
                }

                response.Id = check;
                response.Successful();

                return(response);
            }
            catch (Exception ex)
            {
                response.Failure(ex.ToString());

                return(response);
            }
        }
        public static void Execute()
        {
            // Blob retention
            using (KLog blobRetention = new KLog("BlobFileRetention-BlobRetention"))
            {
                try
                {
                    IEnumerable <BlobFileModel> retentionFileCollection = BlobFileCollection.CurrentRetentionCount();

                    blobRetention.Info($"Retention Count: {retentionFileCollection.Count()}");

                    foreach (BlobFileModel blobFile in retentionFileCollection)
                    {
                        // for each file, confim check one more
                        blobRetention.Info($"Retention => File Name: {blobFile.CloudFile}");

                        string cloudFile = blobFile.CloudFile;

                        try
                        {
                            BlobClient.DeleteBlobFile(cloudFile);

                            blobRetention.Info($"File Deleted => File Name: {blobFile.CloudFile}");
                        }
                        catch (Exception ex)
                        {
                            blobRetention.Error($"Delete Failure: {blobFile.CloudFile} Exception: {ex}");
                        }
                    }
                }
                catch (Exception ex)
                {
                    blobRetention.Error($"BlobFileRetention Exception: {ex.ToString()}");
                }
            }

            // SQL Retention
            using (KLog sqlRetention = new KLog("BlobFileRetention-SQLRetention"))
            {
                try
                {
                    SQLResponseModel checkRetention = DataAccessor.Retention(Configuration.RetentionDays);

                    if (!checkRetention.Success)
                    {
                        sqlRetention.Error($"SQL Expection on [BlobFileRetention].[Retention] - Message: {checkRetention.Message}");
                    }
                }
                catch (Exception ex)
                {
                    sqlRetention.Error($"BlobFileRetention Exception: {ex.ToString()}");
                }
            }
        }
        /// <summary>
        /// Add the start of the Kiroku logging Instance.
        /// </summary>
        /// <param name="instanceHeader"></param>
        /// <returns></returns>
        public static SQLResponseModel AddInstanceStart(InstanceModel instanceHeader)
        {
            SQLResponseModel response = new SQLResponseModel();

            try
            {
                using (var connection = new SqlConnection(Configuration.SqlConnetionString))
                {
                    var cmd = new SqlCommand("usp_Kiroku_KInstances_InsertStart", connection);
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("ui_instanceid", instanceHeader.InstanceID);
                    cmd.Parameters.AddWithValue("dt_instancestart", instanceHeader.EventTime);
                    cmd.Parameters.AddWithValue("ui_applicationid", instanceHeader.ApplicationID);
                    cmd.Parameters.AddWithValue("nvc_trackid", instanceHeader.TrackID);
                    cmd.Parameters.AddWithValue("nvc_regionid", instanceHeader.RegionID);
                    cmd.Parameters.AddWithValue("nvc_clusterid", instanceHeader.ClusterID);
                    cmd.Parameters.AddWithValue("nvc_deviceid", instanceHeader.DeviceID);
                    cmd.Parameters.AddWithValue("nvc_klogversion", instanceHeader.Version);

                    connection.Open();

                    var reader = cmd.ExecuteReader();

                    response.Successful();

                    return(response);
                }
            }
            catch (Exception ex)
            {
                response.Failure(ex.ToString());

                return(response);
            }
        }