#region copyright
//------------------------------------------------------------------------------
//  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
//  此代码版权(除特别声明外的代码)归作者本人Diego所有
//  源代码使用协议遵循本仓库的开源协议及附加协议
//  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
//  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
//  使用文档:https://diego2098.gitee.io/thingsgateway-docs/
//  QQ群:605534569
//------------------------------------------------------------------------------
#endregion
using BlazorComponent;
using Mapster;
using Masa.Blazor;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using SqlSugar;
using System.IO;
using System.Threading;
using ThingsGateway.Admin.Blazor;
using ThingsGateway.Admin.Blazor.Core;
using ThingsGateway.Admin.Core;
using ThingsGateway.Application;
namespace ThingsGateway.Blazor;
/// 
/// 设备状态页面
/// 
public partial class DeviceStatusPage : IDisposable
{
    readonly PeriodicTimer _periodicTimer = new(TimeSpan.FromSeconds(1));
    List _collectDeviceCores = new();
    private string _collectDeviceGroup;
    List _collectDeviceGroups = new();
    string _collectDeviceGroupSearchName;
    List _uploadDeviceCores = new();
    private string _uploadDeviceGroup;
    List _uploadDeviceGroups = new();
    string _uploadDeviceGroupSearchName;
    CollectDeviceCore collectDeviceInfoItem;
    List CurMessages = new();
    bool isAllRestart;
    private bool isDownExport;
    bool isRestart;
    bool pauseMessage;
    StringNumber tab;
    UploadDeviceCore uploadDeviceInfoItem;
    AlarmWorker AlarmHostService { get; set; }
    CollectDeviceWorker CollectDeviceHostService { get; set; }
    [Inject]
    GlobalDeviceData GlobalDeviceData { get; set; }
    IJSObjectReference Helper { get; set; }
    HistoryValueWorker HistoryValueHostService { get; set; }
    [Inject]
    InitTimezone InitTimezone { get; set; }
    [Inject]
    IJSRuntime JS { get; set; }
    [CascadingParameter]
    MainLayout MainLayout { get; set; }
    MemoryVariableWorker MemoryVariableWorker { get; set; }
    StringNumber Panel { get; set; }
    UploadDeviceWorker UploadDeviceHostService { get; set; }
    StringNumber Uppanel { get; set; }
    /// 
    /// 
    /// 
    public override void Dispose()
    {
        _periodicTimer?.Dispose();
        base.Dispose();
    }
    /// 
    protected override void OnInitialized()
    {
        CollectDeviceHostService = ServiceHelper.GetBackgroundService();
        UploadDeviceHostService = ServiceHelper.GetBackgroundService();
        AlarmHostService = ServiceHelper.GetBackgroundService();
        HistoryValueHostService = ServiceHelper.GetBackgroundService();
        MemoryVariableWorker = ServiceHelper.GetBackgroundService();
        _ = RunTimerAsync();
        base.OnInitialized();
    }
    /// 
    /// 
    /// 
    protected override void OnParametersSet()
    {
        CollectDeviceQuery();
        UploadDeviceQuery();
        base.OnParametersSet();
    }
    async Task AllRestartAsync()
    {
        try
        {
            var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
            if (confirm)
            {
                isAllRestart = true;
                StateHasChanged();
                PopupService.ShowProgressLinear();
                await Task.Run(async () => await CollectDeviceHostService.RestartDeviceThreadAsync());
                CollectDeviceQuery();
                UploadDeviceQuery();
            }
        }
        finally
        {
            collectDeviceInfoItem = null;
            uploadDeviceInfoItem = null;
            isAllRestart = false;
            PopupService.HideProgressLinear();
            await MainLayout.StateHasChangedAsync();
        }
    }
    void CollectDeviceInfo(CollectDeviceCore item)
    {
        collectDeviceInfoItem = item;
        CurMessages = new();
    }
    void CollectDeviceQuery()
    {
        _collectDeviceGroups = GlobalDeviceData.CollectDevices.Adapt>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
        _collectDeviceCores = CollectDeviceHostService?.CollectDeviceCores?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _collectDeviceGroup).ToList() ?? new();
    }
    async Task ConfigAsync(long devId, bool? isStart)
    {
        var str = isStart == true ? "启动" : "暂停";
        var confirm = await PopupService.OpenConfirmDialogAsync(str, $"确定{str}?");
        if (confirm)
        {
            CollectDeviceHostService.ConfigDeviceThread(devId, isStart == true);
        }
    }
    async Task DownDeviceMessageExportAsync(List values)
    {
        try
        {
            isDownExport = true;
            StateHasChanged();
            using var memoryStream = new MemoryStream();
            using StreamWriter writer = new(memoryStream);
            foreach (var item in values)
            {
                writer.WriteLine(item);
            }
            writer.Flush();
            memoryStream.Seek(0, SeekOrigin.Begin);
            using var streamRef = new DotNetStreamReference(stream: memoryStream);
            Helper ??= await JS.InvokeAsync("import", $"/_content/ThingsGateway.Admin.Blazor.Core/js/downloadFileFromStream.js");
            await Helper.InvokeVoidAsync("downloadFileFromStream", $"报文导出{SysDateTimeExtensions.CurrentDateTime.ToFileDateTimeFormat()}.txt", streamRef);
        }
        finally
        {
            isDownExport = false;
        }
    }
    //去除单个采集重启
    //async Task RestartAsync(long devId)
    //{
    //    try
    //    {
    //        var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
    //        if (confirm)
    //        {
    //            isRestart = true;
    //            StateHasChanged();
    //            await Task.Run(async () => await CollectDeviceHostService.UpDeviceThreadAsync(devId));
    //            collectDeviceInfoItem = null;
    //            CollectDeviceQuery();
    //        }
    //    }
    //    catch (Exception ex)
    //    {
    //        await PopupService.EnqueueSnackbarAsync(ex.Message, AlertTypes.Warning);
    //    }
    //    finally
    //    {
    //        isRestart = false;
    //        await MainLayout.StateHasChangedAsync();
    //    }
    //}
    private async Task RunTimerAsync()
    {
        while (await _periodicTimer.WaitForNextTickAsync())
        {
            try
            {
                {
                    _collectDeviceGroups = GlobalDeviceData.CollectDevices.Adapt>()?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
                    _collectDeviceCores = CollectDeviceHostService?.CollectDeviceCores?.WhereIF(!_collectDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _collectDeviceGroup).ToList() ?? new();
                }
                if (_collectDeviceCores?.FirstOrDefault()?.Device == null || CollectDeviceHostService?.CollectDeviceCores.Count != _collectDeviceCores.Count)
                {
                    CollectDeviceQuery();
                }
                if (_uploadDeviceCores?.FirstOrDefault()?.Device == null || UploadDeviceHostService?.UploadDeviceCores.Count != _uploadDeviceCores.Count)
                {
                    UploadDeviceQuery();
                }
                await InvokeAsync(StateHasChanged);
            }
            catch
            {
            }
        }
    }
    async Task UpConfigAsync(long devId, bool? isStart)
    {
        var str = isStart == true ? "启动" : "暂停";
        var confirm = await PopupService.OpenConfirmDialogAsync(str, $"确定{str}?");
        if (confirm)
        {
            UploadDeviceHostService.ConfigDeviceThread(devId, isStart == true);
        }
    }
    void UploadDeviceInfo(UploadDeviceCore item)
    {
        uploadDeviceInfoItem = item;
    }
    void UploadDeviceQuery()
    {
        _uploadDeviceGroups = UploadDeviceHostService.UploadDeviceCores.Select(a => a.Device)?.Select(a => a.DeviceGroup)?.Where(a => a != null).Distinct()?.ToList() ?? new();
        _uploadDeviceCores = UploadDeviceHostService?.UploadDeviceCores?.WhereIF(!_uploadDeviceGroup.IsNullOrEmpty(), a => a.Device?.DeviceGroup == _uploadDeviceGroup).ToList() ?? new();
    }
    async Task UpRestartAsync(long devId)
    {
        try
        {
            var confirm = await PopupService.OpenConfirmDialogAsync("重启", "确定重启?");
            if (confirm)
            {
                isRestart = true;
                StateHasChanged();
                await Task.Run(async () => await UploadDeviceHostService.UpDeviceThreadAsync(devId));
                uploadDeviceInfoItem = null;
                UploadDeviceQuery();
            }
        }
        catch (Exception ex)
        {
            await PopupService.EnqueueSnackbarAsync(ex.Message, AlertTypes.Warning);
        }
        finally
        {
            isRestart = false;
            await MainLayout.StateHasChangedAsync();
        }
    }
}