using System;
using System.Linq;
using AppConv.General;
using AppConv.Units;
using Base;

namespace AppConv {
	public sealed class App : IApp {
		private static readonly IUnitType[] Processors = {
			new Temperature(),
			new Weight(),
			new Length(),
			new Area(),
			new Volume(),
			new Angle(),
			new Storage(),
			new Radix()
		};

		public string[] RecognizedNames => new string[] {
			"conv",
			"convert"
		};

		public MatchConfidence GetConfidence(Command cmd) {
			return cmd.Text.IndexOf(" to ", StringComparison.InvariantCultureIgnoreCase) != -1 ? MatchConfidence.Possible : MatchConfidence.None;
		}

		public string ProcessCommand(Command cmd) {
			string[] data = cmd.Text.Split(new string[] { " to " }, 2, StringSplitOptions.None);

			string src = data[0].Trim();
			string dst = data[1].Trim();

			if (src.Length == 0 || dst.Length == 0) {
				throw new CommandException("Unrecognized conversion app syntax.");
			}

			string result = string.Empty;
			IUnitType used = Processors.FirstOrDefault(processor => processor.TryProcess(src, dst, out result));

			if (used == null) {
				throw new CommandException("Could not recognize conversion units.");
			}

			return result;
		}
	}
}