using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;

namespace Predictalytics.Shell.Services;

/// <summary>
/// Konsolen-Vorbereitung fuer den Headless-Modus.
/// <para>
/// Das Projekt ist als WinExe gebaut, damit unter Windows kein Konsolenfenster
/// hinter der GUI steht. Im Headless-Modus fehlt dadurch aber die Ausgabe, wenn
/// aus einer Eingabeaufforderung gestartet wird — <see cref="TryAttachToParent"/>
/// haengt den Prozess an die Konsole des aufrufenden Prozesses an.
/// </para>
/// <para>Unter Linux ist WinExe gleichbedeutend mit Exe; dort entfaellt das Anhaengen.</para>
/// </summary>
internal static class ConsoleAttach
{
    private const int AttachParentProcess = -1;

    public static void TryAttachToParent()
    {
        if (OperatingSystem.IsWindows())
        {
            try { AttachConsole(AttachParentProcess); }
            catch { /* ohne Konsole bleiben die Logdateien */ }
        }

        // Die Logausgabe enthaelt Rahmenzeichen und Emoji. Linux-Terminals sind
        // ohnehin UTF-8, die Windows-Konsole laeuft ohne das hier auf der
        // ANSI-Codepage und zeigt nur Fragezeichen.
        try { Console.OutputEncoding = Encoding.UTF8; }
        catch { /* keine Konsole angehaengt — irrelevant */ }
    }

    [SupportedOSPlatform("windows")]
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);
}
