using File_Watcher.Models;
using Microsoft.Extensions.Hosting.WindowsServices;
using System.Data;

namespace File_Watcher;

public partial class Worker : BackgroundService
{

    private readonly bool _IsWindowsService;
    private readonly ILogger<Worker> _Logger;
    private readonly AppSettings _AppSettings;

    public Worker(IServiceProvider serviceProvider, ILogger<Worker> logger, AppSettings appSettings, List<string> collection)
    {
        _Logger = logger;
        _AppSettings = appSettings;
        logger.LogInformation("{buildNumber}-{gitCommitSeven}", _AppSettings.BuildNumber, _AppSettings.GitCommitSeven);
        try
        { logger.LogInformation("<{folder}>", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); }
        catch (Exception) { }
        _IsWindowsService = collection.Contains(nameof(WindowsServiceLifetime));
    }

    private void BodyInner(CancellationToken cancellationToken)
    {
        _Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
        if (!Directory.Exists(_AppSettings.WatchDirectory))
            _ = Directory.CreateDirectory(_AppSettings.WatchDirectory);
        else
        {
            _ = _AppSettings.Helper switch
            {
                nameof(Helpers.HelperNuget) => Helpers.HelperNuget.Sync(_AppSettings, _Logger),
                nameof(Helpers.HelperTCP) => Helpers.HelperTCP.ReadWrite(_AppSettings, _Logger),
                nameof(Helpers.HelperCompass) => Helpers.HelperCompass.CopyFile(_AppSettings, _Logger),
                nameof(Helpers.HelperStratus) => Helpers.HelperStratus.MoveFile(_AppSettings, _Logger),
                nameof(Helpers.HelperEAFLog) => Helpers.HelperEAFLog.DeleteFiles(_AppSettings, _Logger),
                nameof(Helpers.HelperInfinityQS) => Helpers.HelperInfinityQS.RunMI(_AppSettings, _Logger),
                nameof(Helpers.HelperEventLog) => Helpers.HelperEventLog.ClearEventLogs(_AppSettings, _Logger),
                nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger),
                nameof(Helpers.HelperEAFProgramData) => Helpers.HelperEAFProgramData.MoveFiles(_AppSettings, _Logger),
                nameof(Helpers.HelperSerial) => Helpers.HelperSerial.ReadWrite(_AppSettings, _Logger, cancellationToken),
                nameof(Helpers.HelperMetrologyFiles) => Helpers.HelperMetrologyFiles.SortAndDelete(_AppSettings, _Logger),
                nameof(Helpers.HelperEDADatabase) => Helpers.HelperEDADatabase.SaveDataCollectionPlans(_AppSettings, _Logger, cancellationToken),
                _ => throw new NotSupportedException()
            };
        }
        _Logger.LogInformation("B) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt"));
    }

    private async Task Body(CancellationToken cancellationToken)
    {
        if (!_IsWindowsService)
        {
            _Logger.LogInformation("Set break point and skip to run {_AppSettings.Helper}!", _AppSettings.Helper);
            throw new EvaluateException($"Set break point and skip to run {_AppSettings.Helper}!");
        }
        if (!_IsWindowsService)
        {
            for (int i = 0; i < int.MaxValue; i++)
            {
                BodyInner(cancellationToken);
                Thread.Sleep(500);
            }
        }
        while (_IsWindowsService && !cancellationToken.IsCancellationRequested)
        {
            BodyInner(cancellationToken);
            await Task.Delay(_AppSettings.MillisecondsDelay, cancellationToken);
        }
    }

    protected override async Task ExecuteAsync(CancellationToken cancellationToken) =>
        await Body(cancellationToken);
}