using System;
using AudibleApi;
using InternalUtilities;
using LibationWinForms.Dialogs.Login;

namespace LibationWinForms.Login
{
	public class WinformResponder : ILoginCallback
	{
		private Account _account { get; }

		public WinformResponder(Account account)
		{
			_account = Dinah.Core.ArgumentValidator.EnsureNotNull(account, nameof(account));
		}

		public string Get2faCode()
		{
			using var dialog = new _2faCodeDialog();
			if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				return dialog.Code;
			return null;
		}

		public string GetCaptchaAnswer(byte[] captchaImage)
		{
			using var dialog = new CaptchaDialog(captchaImage);
			if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				return dialog.Answer;
			return null;
		}

		public (string name, string value) GetMfaChoice(MfaConfig mfaConfig)
		{
			using var dialog = new MfaDialog(mfaConfig);
			if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				return (dialog.SelectedName, dialog.SelectedValue);
			return (null, null);
		}

		public (string email, string password) GetLogin()
		{
			using var dialog = new AudibleLoginDialog(_account);
			if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
				return (dialog.Email, dialog.Password);
			return (null, null);
		}

		public void ShowApprovalNeeded()
		{
			using var dialog = new ApprovalNeededDialog();
			dialog.ShowDialog();
		}
	}
}