using System;
using System.Diagnostics;
using System.Text;
using Base;

namespace AppSys.Handlers;

sealed class HandlerProcesses : IHandler {
	public bool Matches(Command cmd) {
		return cmd.Text.StartsWith("kill ", StringComparison.InvariantCultureIgnoreCase);
	}

	public string Handle(Command cmd) {
		string[] processNames = cmd.Text["kill ".Length..].Split(',', ';');
		int succeeded = 0, failed = 0;

		foreach (string processName in processNames) {
			try {
				Process[] processes = Process.GetProcessesByName(processName.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase) ? processName[..^4] : processName);

				foreach (Process process in processes) {
					try {
						process.Kill();
						++succeeded;
					} catch {
						++failed;
					}

					process.Close();
				}
			} catch {
				++failed;
			}
		}

		if (succeeded == 0 && failed == 0 && (cmd.Text.Equals("kill me", StringComparison.InvariantCultureIgnoreCase) || cmd.Text.StartsWith("kill me ", StringComparison.InvariantCultureIgnoreCase) || cmd.Text.StartsWith("kill me,", StringComparison.InvariantCultureIgnoreCase))) {
			return "No.";
		}

		var build = new StringBuilder();
		build.Append("Killed ").Append(succeeded).Append(" process").Append(succeeded == 1 ? "" : "es");

		if (failed > 0) {
			build.Append(", failed ").Append(failed);
		}

		return build.Append('.').ToString();
	}
}