using System.Diagnostics;
using static IronPython.Modules._ast;

namespace Hawkeye.VisionBuilder.Workflow.DataTransfer;

public class DockerScriptRunner
{
    private Process process;
    private readonly string _workingDirectory;

    public DockerScriptRunner(string workingDirectory)
    {
        _workingDirectory = workingDirectory;
    }
    public static string ConvertToWslPath(string windowsPath)
    {
        if (string.IsNullOrWhiteSpace(windowsPath))
            throw new ArgumentException("Path cannot be null or empty.", nameof(windowsPath));

        // Replace backslashes with forward slashes
        string wslPath = windowsPath.Replace('\\', '/');

        // Extract the drive letter and convert it to WSL format
        if (wslPath.Length > 1 && wslPath[1] == ':')
        {
            char driveLetter = char.ToLower(wslPath[0]);
            wslPath = $"/mnt/{driveLetter}{wslPath.Substring(2)}";
        }

        return wslPath;
    }
    public void Start()
    {

        var killContainerArg = @"-d ubuntu -u root -e sh -c ""docker rm -f cv || true""";
        var killProcess = new Process
        {
            StartInfo = new ProcessStartInfo("wsl", killContainerArg)
            {
                UseShellExecute = false
            }
        };
        killProcess.Start();
        killProcess.WaitForExit();
        killProcess.Dispose();

        //startInfo.CreateNoWindow = true;
        // create and start the process
        process = new Process();
        var convertedWd = ConvertToWslPath(_workingDirectory);
        var arg =
            $@"-d ubuntu -u root -e sh -c ""cd \""{convertedWd}\"" && docker run --rm --name cv --gpus all -it -p 8000:8000 -v \""$(pwd)\"":/app -w /app cv uvicorn --host 0.0.0.0 PythonModelAPI:app """;
        
        Console.WriteLine("args:"+arg);
        process.StartInfo = new ProcessStartInfo("wsl", arg)
        {
            UseShellExecute = false,
            CreateNoWindow = true
        };
        process.Start();
        
        // on windows only
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            ChildProcessTracker.AddProcess(process);


    }

    public void Stop()
    {
        if (process != null && !process.HasExited)
        {
            process.Kill();
            process.Dispose();
            process = null;
        }
    }
}