using System;
using System.Runtime.InteropServices;

namespace Alibabacloud.Rum.Unity.Windows
{
    /// <summary>
    /// Native SDK log levels for options_set_debug_level (alibabacloud_rum_level_t)
    /// </summary>
    internal enum AlibabacloudRumSdkLogLevel
    {
        Fatal = 1,
        Error = 2,
        Warning = 3,
        Info = 4,
        Debug = 5,
        Trace = 6,
        All = 7
    }

    /// <summary>
    /// Native SDK log levels for custom_log_set_log (alibabacloud_rum_custom_log_level_t)
    /// </summary>
    internal enum AlibabacloudRumLogLevel
    {
        Trace = 0,
        Debug = 1,
        Info = 2,
        Warn = 3,
        Error = 4,
        Fatal = 5
    }

    /// <summary>
    /// Native SDK environment types
    /// </summary>
    internal enum AlibabacloudRumEnv
    {
        Prod = 1,
        Gray = 2,
        Pre = 3,
        Daily = 4,
        Local = 5
    }

    /// <summary>
    /// Native SDK resource types
    /// </summary>
    internal enum AlibabacloudRumResourceType
    {
        Document = 0,
        Xhr = 1,
        Fetch = 2,
        Beacon = 3,
        Css = 4,
        Js = 5,
        Image = 6,
        Font = 7,
        Media = 8,
        Other = 9
    }

    /// <summary>
    /// Native SDK tracing protocols
    /// </summary>
    internal enum AlibabacloudRumTracingProtocol
    {
        W3C = 0,
        SkyWalking = 1
    }

    /// <summary>
    /// P/Invoke bindings for alibabacloud_rum.dll
    /// </summary>
    internal static class AlibabacloudRumNativeBridge
    {
        private const string DllName = "alibabacloud_rum";

        #region Options

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_options_new();

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_free(IntPtr options);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_network_options_new();

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_network_options_free(IntPtr networkOptions);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_network_options(
            IntPtr options,
            IntPtr networkOptions);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_config_address(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string config_address);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_app_id(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string app_id);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_app_name(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string app_name);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_app_version(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string app_version);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_env(
            IntPtr options,
            int env);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_utdid(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string utdid);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_debug_level(
            IntPtr options,
            int level);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_cache_path(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string path);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_handler_path(
            IntPtr options,
            [MarshalAs(UnmanagedType.LPStr)] string path);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_auto_crash_tracking(
            IntPtr options,
            int enabled);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_auto_curl_tracking(
            IntPtr options,
            int enabled);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_options_set_auto_cef_tracking(
            IntPtr options,
            int enabled);

        #endregion

        #region Init & Close

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern int alibabacloud_rum_init(IntPtr options);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern int alibabacloud_rum_close();

        #endregion

        #region Session

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_start_session();

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_end_session();

        #endregion

        #region User

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_set_userid(
            [MarshalAs(UnmanagedType.LPStr)] string userid);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_set_username(
            [MarshalAs(UnmanagedType.LPStr)] string username);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_set_user_tags(
            [MarshalAs(UnmanagedType.LPStr)] string user_tags);

        #endregion

        #region Custom Event

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_custom_event_new(
            [MarshalAs(UnmanagedType.LPStr)] string type,
            [MarshalAs(UnmanagedType.LPStr)] string name);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_set_value(
            IntPtr evt,
            double value);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_set_group(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string group);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_set_snapshots(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string snapshots);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_add_extra(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string key,
            [MarshalAs(UnmanagedType.LPStr)] string value);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_report(IntPtr evt);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_event_free(IntPtr evt);

        #endregion

        #region Custom Log

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_custom_log_new(
            [MarshalAs(UnmanagedType.LPStr)] string type,
            [MarshalAs(UnmanagedType.LPStr)] string name);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_set_log(
            IntPtr log,
            int level,
            [MarshalAs(UnmanagedType.LPStr)] string content);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_set_value(
            IntPtr log,
            double value);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_set_group(
            IntPtr log,
            [MarshalAs(UnmanagedType.LPStr)] string group);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_set_snapshots(
            IntPtr log,
            [MarshalAs(UnmanagedType.LPStr)] string snapshots);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_add_extra(
            IntPtr log,
            [MarshalAs(UnmanagedType.LPStr)] string key,
            [MarshalAs(UnmanagedType.LPStr)] string value);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_report(IntPtr log);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_log_free(IntPtr log);

        #endregion

        #region Custom Exception

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_custom_exception_new(
            [MarshalAs(UnmanagedType.LPStr)] string name,
            [MarshalAs(UnmanagedType.LPStr)] string message);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_set_file(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string file);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_set_source(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string source);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_set_caused_by(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string caused_by);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_set_stack(
            IntPtr evt,
            [MarshalAs(UnmanagedType.LPStr)] string stack);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_report(IntPtr evt);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_exception_free(IntPtr evt);

        #endregion

        #region Custom Resource

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr alibabacloud_rum_custom_resource_new(
            [MarshalAs(UnmanagedType.LPStr)] string url,
            [MarshalAs(UnmanagedType.LPStr)] string method);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_type(
            IntPtr resource,
            int type);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_status_code(
            IntPtr resource,
            int status_code);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_success(
            IntPtr resource,
            int success);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_error_message(
            IntPtr resource,
            [MarshalAs(UnmanagedType.LPStr)] string error_message);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_measuring(
            IntPtr resource,
            long duration,
            long size,
            int connect_duration,
            int ssl_duration,
            int dns_duration,
            int redirect_duration,
            int first_byte_duration,
            int download_duration);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_trace_id(
            IntPtr resource,
            [MarshalAs(UnmanagedType.LPStr)] string trace_id);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_span_id(
            IntPtr resource,
            [MarshalAs(UnmanagedType.LPStr)] string span_id);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_protocol(
            IntPtr resource,
            int protocol);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_set_provider(
            IntPtr resource,
            [MarshalAs(UnmanagedType.LPStr)] string provider);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_add_attribute(
            IntPtr resource,
            [MarshalAs(UnmanagedType.LPStr)] string key,
            [MarshalAs(UnmanagedType.LPStr)] string value);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_report(IntPtr resource);

        [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
        internal static extern void alibabacloud_rum_custom_resource_free(IntPtr resource);

        #endregion
    }
}
