using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using DeployAll;

AppDomain.CurrentDomain.ProcessExit += (_, _) => Console.WriteLine("Bye!");

while (!Directory.GetFiles(".").Any(f => f.EndsWith(".sln")))
{
    Directory.SetCurrentDirectory("..");
}

const string windowsClientProj = "Barotrauma/BarotraumaClient/WindowsClient.csproj";

Version gameVersion = Version.Parse(
    XDocument.Load(windowsClientProj).Root?
        .Element("PropertyGroup")?
        .Element("Version")?
        .Value ?? throw new Exception($"Version not found in {windowsClientProj}"));

string gitRevision = GitCmd.GetRevision();
string gitBranch = GitCmd.GetBranch();

Console.WriteLine($"DEPLOYALL - Barotrauma v{gameVersion}, branch {gitBranch}, revision {gitRevision}");

if (GitCmd.HasUncommittedChanges())
{
    if (Util.AskQuestion("The repo currently has some uncommitted changes. Do you still wish to proceed? [y/n]")
        .AnsweredNo()) { return; }
}
else if (GitCmd.IsRepoOutOfSync())
{
    if (Util.AskQuestion("The repo is currently out of sync. Do you still wish to proceed? [y/n]")
        .AnsweredNo()) { return; }
}

var sdkVersion = DotnetCmd.GetSdkVersion();
Console.WriteLine($"Using .NET SDK {sdkVersion}");

string configuration = Util.AskQuestion("Type 1 for Release, 2 for Unstable, enter nothing to cancel") switch
{
    "1" => "Release",
    "2" => "Unstable",
    _ => ""
};
if (string.IsNullOrWhiteSpace(configuration)) { return; }

Deployables.Generate(configuration, gameVersion, gitBranch, gitRevision);

if (Util.AskQuestion("Would you like to upload the generated builds to EGS? [y/n]")
    .AnsweredYes())
{
    EgsAssistant.Upload(gameVersion, configuration, gitRevision);
}


if (Util.AskQuestion("Would you like to upload the generated builds to Steam? [y/n]")
    .AnsweredNo()) { return; }

SteamPipeAssistant.PrepareSteamCmd();
SteamPipeAssistant.PrepareScripts(configuration, gameVersion, gitBranch, gitRevision);

string userName = Util.AskQuestion("Type your Steam username to upload to Steamworks, enter nothing to skip uploading");
if (string.IsNullOrWhiteSpace(userName)) { return; }

SteamPipeAssistant.Upload(userName, configuration);
