using System.Diagnostics;
using System.Text;

namespace File_Folder_Helper.Helpers;

internal static class HelperStart
{

    internal static bool Start(string[] errorChecks, string[] successChecks, ProcessStartInfo processStartInfo, string errorFile)
    {
        bool result = false;
        string standardError = string.Empty;
        string standardOutput = string.Empty;
        StringBuilder stringBuilder = new();
        Process? process = Process.Start(processStartInfo);
        long breakAfter = DateTime.Now.AddSeconds(20).Ticks;
        for (short j = 0; j < short.MaxValue; j++)
        {
            if (process is null || process.HasExited || process.WaitForExit(500) || DateTime.Now.Ticks > breakAfter)
                break;
        }
        if (process is not null && processStartInfo.RedirectStandardOutput)
        {
            _ = stringBuilder.Append(process.StandardOutput.ReadToEnd());
            standardOutput = stringBuilder.ToString();
            if (string.IsNullOrEmpty(standardOutput))
                standardOutput = string.Concat(standardOutput);
            if (!string.IsNullOrEmpty(standardOutput))
            {
                result = (from l in successChecks where standardOutput.Contains(l) select 1).Any();
                if (result)
                    result = !(from l in errorChecks where standardOutput.Contains(l) select 1).Any();
            }
        }
        if (process is not null && processStartInfo.RedirectStandardError)
        {
            standardError = process.StandardError.ReadToEnd();
            if (!string.IsNullOrEmpty(standardError))
            {
                if (result)
                {
                    result = (from l in successChecks where standardError.Contains(l) select 1).Any();
                    if (result)
                        result = !(from l in errorChecks where standardError.Contains(l) select 1).Any();
                }
            }
        }
        if (!result)
            result = standardOutput == string.Empty && standardError == string.Empty;
        if (!result)
            File.WriteAllLines(errorFile, new string[] { standardOutput, Environment.NewLine, Environment.NewLine, standardError });
        return result;
    }

}