<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>SDK Playground</title>

	<!-- Google Fonts -->
	<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">

	<!-- CSS Reset -->
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.css">

	<!-- Milligram CSS -->
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/milligram/1.4.1/milligram.css">

	<style>
		.wrapper {
			display: block;
			overflow: hidden;
			position: relative;
			width: 100%
		}

		.wrapper .container {
			max-width: 80rem
		}

		.wrapper>.container {
			padding-bottom: 7.5rem;
			padding-top: 7.5rem
		}

		#response {
			background: black;
			color: greenyellow;
			height: 250px;
		}

		.w-100 {
			width: 100%;
		}
	</style>
</head>

<body>
	<main class="wrapper">
		<div class="container">

			<blockquote>
				<h4><em>Transaction Service.</em></h4>
			</blockquote>

			<div class="row">
				<div class="column">
					<fieldset>
						<legend>ORDER ID</legend>
						<input type="text" name="order_id" placeholder="ORDER-TEST" value="ORDER-FA168BDFFCB2">
					</fieldset>
				</div>
				<div class="column">
					<fieldset>
						<legend>Platform User</legend>
						<input type="text" name="user" placeholder="hash" value="">
					</fieldset>
				</div>
			</div>
			<div class="row">
				<div class="column">
					<button name="loading" class="w-100">Without Loading</button>
				</div>
				<div class="column">
					<button name="status" class="w-100">Payment Status</button>
				</div>
				<div class="column">
					<button name="capture" class="w-100">Run Capture</button>
				</div>
				<div class="column">
					<button name="void" class="w-100">Run Void</button>
				</div>
			</div>
			<fieldset>
				<legend>Select card</legend>
				<select name="cards" id="cards">
					<option value="4111111111111111">(2.0) Generic transaction</option>
					<option value="4000000000001000">(2.1) Successful Authentication</option>
					<option value="4000000000001018">(2.2) Failed Authentication</option>
					<option value="4000000000001026">(2.3) Attempts Stand-In Authentication</option>
					<option value="4000000000001034">(2.4) Unavailable Authentication from the Issuer</option>
					<option value="4000000000001042">(2.5) Rejected Authentication by the Issuer</option>
					<option value="4000000000001059">(2.6) Authentication Not Available on Lookup</option>
					<option value="4000000000001067">(2.7) Error on Lookup</option>
					<option value="4000000000001075">(2.8) Timeout on cmpi_lookup Transaction</option>
					<option value="4000000000001091">(2.9) Successful Step Up Authentication</option>
					<option value="4000000000001109">(2.10) Failed Step Up Authentication</option>
					<option value="4000000000001117">(2.11) Step Up Authentication is Unavailable</option>
					<option value="4000000000001125">(2.12) Error on Authentication</option>
					<option value="4000000000001083">(2.13) Bypassed Authentication</option>
					<option value="4000010000000001">(2.14) Require MethodURL</option>
				</select>
			</fieldset>

			<div class="row">
				<div class="column">
					<fieldset>
						<legend>Currency</legend>
						<select name="currency" id="currency">
							<option selected value="HNL">L</option>
							<option value="USD">$</option>
							<option value="NIO">C$</option>
							<option value="GTQ">Q.</option>
							<option value="CRC">₡</option>
						</select>
					</fieldset>
				</div>
				<div class="column">
					<fieldset>
						<legend>Amount</legend>
						<input type="number" name="amount" value="1.00">
					</fieldset>
				</div>
			</div>

			<div class="row">
				<div class="column">
					<fieldset>
						<legend>Card Number</legend>
						<input type="text" name="card_number" value="4111 1111 1111 1111">
					</fieldset>
				</div>
				<div class="column">
					<fieldset>
						<legend>Card Holder</legend>
						<input type="text" name="card_holder" value="Test Card">
					</fieldset>
				</div>
			</div>

			<div class="row">
				<div class="column">
					<fieldset>
						<legend>Expire Month</legend>
						<input type="number" name="expire_month" value="12">
					</fieldset>
				</div>
				<div class="column">
					<fieldset>
						<legend>Expire Year</legend>
						<input type="number" name="expire_year" value="2028">
					</fieldset>
				</div>
				<div class="column">
					<fieldset>
						<legend>CVC</legend>
						<input type="number" name="card_cvv" value="999">
					</fieldset>
				</div>
			</div>

			<fieldset>
				<legend>
					<input type="checkbox" name="3ds"> Enable 3DS/EMV transaction
				</legend>
			</fieldset>

			<div class="row">
				<div class="column">
					<button name="sale" class="w-100">Run Sale</button>
				</div>
				<div class="column">
					<button name="auth" class="w-100">Run Auth</button>
				</div>
			</div>

			<blockquote>
				<h4><em>Tokenization Service.</em></h4>
			</blockquote>

			<fieldset>
				<legend>Token</legend>
				<input type="text" name="token" placeholder="T-xxxxxxxx-xxxxxx-xxxxxx-xxxxxxx">
			</fieldset>

			<div class="row">
				<div class="column"><button name="vault" class="w-100">Run Vault</button></div>
				<div class="column"><button name="authenticate" class="w-100">Run Auth</button></div>
				<div class="column"><button name="show" class="w-100">Run Show</button></div>
				<div class="column"><button name="update" class="w-100">Run Update</button></div>
				<div class="column"><button name="delete" class="w-100">Run Delete</button></div>
			</div>

			<fieldset>
				<legend>Response</legend>
				<textarea name="response" id="response" readonly></textarea>
			</fieldset>
		</div>

	</main>

	<!-- <script src="https://cdn.jsdelivr.net/npm/@pixelpay/sdk-core"></script> -->
	<script src="./lib/browser/index.js"></script>

	<script>
		function prepareEndpoint(settings) {
			settings.setupSandbox();
		}

		function getCard() {
			const card = new Models.Card();
			card.number = document.querySelector('input[name=card_number]').value;
			card.cardholder = document.querySelector('input[name=card_holder]').value;
			card.expire_month = document.querySelector('input[name=expire_month]').value;;
			card.expire_year = document.querySelector('input[name=expire_year]').value;;
			card.cvv2 = document.querySelector('input[name=card_cvv]').value;;

			return card;
		}

		function getBilling() {
			const billing = new Models.Billing();
			billing.address = 'Ave Circunvalacion';
			billing.country = 'HN';
			billing.state = 'HN-CR';
			billing.city = 'San Pedro Sula';
			billing.phone = '50499999999';

			return billing;
		}

		function getOrder() {
			const order = new Models.Order();
			order.id = document.querySelector('input[name="order_id"]').value || 'TEST-1234';
			order.currency = document.querySelector('select[name="currency"]').value;
			order.amount = parseFloat(document.querySelector('input[name=amount]').value);
			order.customer_name = 'Jhon Doe';
			order.customer_email = 'jhondoe@pixel.hn';

			return order;
		}

		function showResponse(response) {
			var json = JSON.parse(response);
			json = JSON.stringify(json, undefined, 4);
			document.querySelector('textarea[name="response"]').value = json;
		}

		document.getElementById('cards').onchange = () => {
			const card_selected = document.querySelector('select[name="cards"]').value;
			document.querySelector('input[name=card_number]').value = card_selected;
		}

		document.querySelector('button[name=loading]').onclick = (event) => {
			const button = event.target;
			const main = document.querySelector('main');

			if (main.hasAttribute('without-sdk-loading')) {
				main.removeAttribute('without-sdk-loading');
				button.innerText = 'Without Loading';
			} else {
				main.setAttribute('without-sdk-loading', '');
				button.innerText = 'With Loading';
			}
		}

		document.querySelector('button[name=sale]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Transaction(settings);

			const card = getCard();
			const billing = getBilling();
			const order = getOrder();

			const sale = new Requests.SaleTransaction();
			sale.setCard(card);
			sale.setBilling(billing);
			sale.setOrder(order);

			if (document.querySelector('input[name="3ds"]') && document.querySelector('input[name="3ds"]').checked) {
				sale.withAuthenticationRequest();
			}

			service.doSale(sale).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=auth]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Transaction(settings);

			const card = getCard();
			const billing = getBilling();
			const order = getOrder();

			const auth = new Requests.AuthTransaction();
			auth.setCard(card);
			auth.setBilling(billing);
			auth.setOrder(order);

			if (document.querySelector('input[name="3ds"]') && document.querySelector('input[name="3ds"]').checked) {
				auth.withAuthenticationRequest();
			}

			service.doAuth(auth).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=capture]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Transaction(settings);
			const capture = new Requests.CaptureTransaction();
			capture.payment_uuid = document.querySelector('input[name="order_id"]').value
			capture.transaction_approved_amount = 1.00;

			service.doCapture(capture).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=void]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			user = document.querySelector('input[name="user"]').value
			if (user) {
				settings.setupPlatformUser(user);
			}

			const service = new Services.Transaction(settings);
			const voidTx = new Requests.VoidTransaction();
			voidTx.payment_uuid = document.querySelector('input[name="order_id"]').value
			voidTx.void_reason = 'Transaction Test';

			service.doVoid(voidTx).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=status]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Transaction(settings);

			const statusTx = new Requests.StatusTransaction();
			statusTx.payment_uuid = document.querySelector('input[name="order_id"]').value

			service.getStatus(statusTx).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('body').onclick = (e) => {
			if (e.target == document.querySelector('.pixelpay-loading')) {
				UI.PixelPayLoading.hide();
			}
		}

		document.querySelector('button[name=vault]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Tokenization(settings);
			const cardRequest = new Requests.CardTokenization();
			cardRequest.setCard(getCard());
			cardRequest.setBilling(getBilling());

			service.vaultCard(cardRequest).then(response => {
				token = document.querySelector('input[name="token"]').value = response.getData("token");

				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=authenticate]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Tokenization(settings);
			const authRequest = new Requests.AuthTokenization();

			const input_token = document.querySelector('input[name="token"]').value;
			authRequest.setCardToken(input_token);
			authRequest.setOrder(getOrder());

			service.authCard(authRequest).then(response => {
				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}

		document.querySelector('button[name=show]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Tokenization(settings);

			token = document.querySelector('input[name="token"]').value;
			if (token.includes(',')) {
				const tokens = token.split(',');
				service.showCards(tokens).then(response => {
					showResponse(response.toJson())
					alert(`${response.message} (${response.status})`);
				}).catch(err => {
					console.error(err);
					alert(`${err.message} (ERR)`);
				});
			} else {
				service.showCard(token).then(response => {
					showResponse(response.toJson())
					alert(`${response.message} (${response.status})`);
				}).catch(err => {
					console.error(err);
					alert(`${err.message} (ERR)`);
				});
			}
		}

		document.querySelector('button[name=update]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Tokenization(settings);
			const cardRequest = new Requests.CardTokenization();
			cardRequest.setCard(getCard());
			cardRequest.setBilling(getBilling());

			const input_uuid = document.querySelector('input[name="token"]');

			service.updateCard(input_uuid.value, cardRequest).then(response => {
				token = input_uuid.value = response.getData("token");

				showResponse(response.toJson())
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			})
		}

		document.querySelector('button[name=delete]').onclick = () => {
			const settings = new Models.Settings();
			prepareEndpoint(settings);

			const service = new Services.Tokenization(settings);

			token = document.querySelector('input[name="token"]').value;
			service.deleteCard(token).then(response => {
				showResponse(response.toJson());
				alert(`${response.message} (${response.status})`);
			}).catch(err => {
				console.error(err);
				alert(`${err.message} (ERR)`);
			});
		}
	</script>
</body>

</html>