
using ServiceBase;

namespace EEMSCenterUI.ViewModels;

internal partial class MainWindowViewModel : ObservableObject, IEEMSBaseServerProvider
{
    public MainWindowViewModel()
    {
        this.Server = new()
        {
            IP = "127.0.0.1",
            Port = 50054
        };
    }

    private IClientProvider? _clientProvider;

    [ObservableProperty]
    private ServiceEndpoint _Server;

    [ObservableProperty]
    private string? _GUID;

    [RelayCommand]
    private void StartService()
    {
        EEMSBaseServer baseServer = new();
        if (!baseServer.Initialize(this, out _clientProvider) || _clientProvider is null)
        {
            MessageBox.Show("Service Start Failed");
            return;
        }

        Task.Factory.StartNew(async () =>
        {
            if (!await baseServer.StartServiceAsync(this.Server.IP!, this.Server.Port))
                MessageBox.Show("Service Start Failed");
        }, TaskCreationOptions.LongRunning);
    }

    [RelayCommand]
    private void RequestFile()
    {
        Guid.TryParse(this.GUID, out Guid guid);
        this._clientProvider?.RequestFile(guid, FileType.Config);
    }



    void IEEMSBaseServerProvider.Started()
    {
        Task.Factory.StartNew(() =>
        {
            MessageBox.Show($"Service Started {this.Server.IP}:{this.Server.Port}");
        });
    }

    void IEEMSBaseServerProvider.OnConnected(string ip, ushort port, ServiceHub serviceHub)
    {
        ServiceEndpoint serviceEndpoint = new()
        {
            IP = ip,
            Port = port,
            Hub = serviceHub
        };
        App.Current.Dispatcher?.Invoke(() =>
        {
            Clients[$"{ip}{port}{serviceHub}"] = serviceEndpoint;
        });
    }

    public void OnDisConnected(string ip, ushort port, ServiceHub serviceHub)
    {
        App.Current.Dispatcher?.Invoke(() =>
        {
            Clients.TryRemove($"{ip}{port}{serviceHub}", out _);
        });
    }

    [ObservableProperty]
    ObservableDictionary<string, ServiceEndpoint> _Clients = [];
}

public partial class ServiceEndpoint : ObservableObject
{
    [ObservableProperty]
    private string? _IP;

    [ObservableProperty]
    private ushort _Port;

    [ObservableProperty]
    private ServiceHub _Hub;
}