<?php

/**
 * Certifique-se de inserir este arquivo na raiz do seu projeto, para que possa validar todos os arquivos
 * e de inserir corretamente o caminho para os arquivos do autoload do Composer na linha 55.
 */

namespace MyApp;

use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;

class MigrationChecker
{
	private const REQUIRED_PACKAGES = [
		'guzzlehttp/guzzle' => '^7.4',
		'symfony/cache' => '^5.0 || ^6.0'
	];

	private const CORRECTIONS = [
		'use Gerencianet\Exception\GerencianetException;' => 'use Efi\Exception\EfiException;',
		'use Gerencianet\Gerencianet;' => 'use Efi\EfiPay;',
		'new Gerencianet' => 'new EfiPay',
		'Gerencianet::getInstance' => 'new EfiPay',
		'catch (GerencianetException' => 'catch (EfiException',
		'oneStep(' => 'createOneStepCharge(',
		'payCharge' => 'definePayMethod',
		'resendBillet' => 'sendBilletEmail',
		'chageLink' => 'defineLinkPayMethod',
		'createChargeBalanceSheet(' => 'defineBalanceSheetBillet(',
		'updateParcel' => 'updateCarnetParcel',
		'cancelParcel' => 'cancelCarnetParcel',
		'resendCarnet' => 'sendCarnetEmail',
		'resendParcel' => 'sendCarnetParcelEmail',
		'getPlans' => 'listPlans',
		'paySubscription' => 'defineSubscriptionPayMethod',
		'pixDevolutionGet' => 'pixDetailDevolution',
		'pixGetWebhook' => 'pixDetailWebhook',
		'pixLocationCreate' => 'pixCreateLocation',
		'pixLocationGet' => 'pixDetailLocation',
		'pixLocationDeleteTxid' => 'pixUnlinkTxidLocation',
		'pixListBalance' => 'getAccountBalance',
		'pixUpdateSettings' => 'updateAccountConfig',
		'pixListSettings' => 'listAccountConfig',
	];

	private $rootDirectory;
	private $composerJson;
	private $installedPackages;

	public function __construct()
	{
		// Insira abaixo o caminho para os arquivos composer.json e installed.json
		$this->rootDirectory = __DIR__;
		$this->composerJson = json_decode(file_get_contents($this->rootDirectory . '/composer.json'), true);
		$this->installedPackages = json_decode(file_get_contents($this->rootDirectory . '/vendor/composer/installed.json'), true);
	}

	public function checkPHPVersion(): array
	{
		$resultPhpVersion = [];
		$phpVersion = PHP_VERSION;
		$resultPhpVersion['version'] = $phpVersion;
		if (version_compare($phpVersion, '7.2.5', '<')) {
			$resultPhpVersion['result'] = "A versão do PHP instalada <b>NÃO ATENDE</b> aos requisitos. <b>Instale o PHP 7.2 ou superior</b>.";
			$resultPhpVersion['icon'] = $this->getIcon('danger');
		} else {
			$resultPhpVersion['result'] = "A versão do PHP instalada atende aos requisitos.";
			$resultPhpVersion['icon'] = $this->getIcon('success');
		}
		return $resultPhpVersion;
	}

	public function checkSDKInstallation(): array
	{
		$resultSdkInfo = [];
		foreach ($this->installedPackages['packages'] as $package) {
			if ($package['name'] === 'efipay/sdk-php-apis-efi' || $package['name'] === 'gerencianet/gerencianet-sdk-php') {
				$packageVersion = $package['version'];
				if ($package['name'] === 'efipay/sdk-php-apis-efi') {
					$resultSdkInfo['result'] = "<kbd>{$package['name']}: $packageVersion</kbd>";
					$resultSdkInfo['icon'] = $this->getIcon('success');
					return $resultSdkInfo;
				} else {
					$resultSdkInfo['result'] = "Atual: <kbd>{$package['name']}: $packageVersion</kbd><hr>Execute o comando abaixo para instalação da nova SDK da Efí:<br><kbd>composer require efipay/sdk-php-apis-efi</kbd>";
					$resultSdkInfo['icon'] = $this->getIcon('danger');
					return $resultSdkInfo;
				}
			}
		}

		if ($this->composerJson['name'] === 'efipay/sdk-php-apis-efi') {
			$resultSdkInfo['result'] = "<kbd class>{$this->composerJson['name']}: {$this->composerJson['version']}</kbd>";
			$resultSdkInfo['icon'] = $this->getIcon('success');
			return $resultSdkInfo;
		}

		return ['result' => '<p class="text-center">A SDK de PHP da Efí não está instalada.</p><hr>Execute o comando abaixo para instalação da nova SDK da Efí:<br><kbd>composer require efipay/sdk-php-apis-efi</kbd>', 'icon' =>  $this->getIcon('danger')];
	}

	private function getIcon($status): string
	{
		if ($status === 'success') {
			return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="green" class="bi bi-check-circle" viewBox="0 0 16 16">
			<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
			<path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z"/>
		  	</svg>';
		} else {
			return '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="red" class="bi bi-x-circle" viewBox="0 0 16 16">
			<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
			<path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/>
			</svg>';
		}
	}

	public function checkRequiredPackages(): array
	{
		$missingPackages = $this->getMissingPackages();
		if (empty($missingPackages)) {
			return ['result' => 'Todas as dependências necessárias estão instaladas.', 'icon' => $this->getIcon('success')];
		} else {
			$missingPackagesList = implode('<br>', $missingPackages);
			return ['result' => "<b>$missingPackagesList</b>", 'icon' => $this->getIcon('danger')];
		}
	}

	public function checkOpenSslEstension(): bool
	{
		return extension_loaded('openssl');
	}

	private function getMissingPackages(): array
	{
		$missingPackages = [];

		foreach (self::REQUIRED_PACKAGES as $package => $version) {
			$packageFound = false;

			foreach ($this->installedPackages['packages'] as $installedPackage) {
				if ($installedPackage['name'] === $package) {
					$installedVersion = $installedPackage['version'];

					// Check if the installed version matches any of the allowed versions
					$allowedVersions = explode(' || ', $version);
					$installedVersion = $this->addVersionPrefix($installedVersion); // Adicionar 'v' se necessário

					foreach ($allowedVersions as $allowedVersion) {
						$allowedVersion = $this->addVersionPrefix($allowedVersion); // Adicionar 'v' se necessário
						if (version_compare($installedVersion, $allowedVersion, '>=')) {
							$packageFound = true;
							break;
						}
					}
				}
			}

			if (!$packageFound) {
				$missingPackages[] = "$package:$version";
			}
		}

		if (!$this->checkOpenSslEstension()) {
			$missingPackages[] .= 'A <a href="https://www.php.net/manual/en/openssl.installation.php" target="_blank">extensão OpenSSL</a> não está habilitada no PHP.';
		}

		return $missingPackages;
	}

	public function addVersionPrefix($version)
	{
		if (strpos($version, 'v') === false) {
			return 'v' . $version;
		}
		return $version;
	}

	public function checkCodeCorrections(): array
	{
		$corrections = $this->getCorrections();
		if (empty($corrections)) {
			return ['result' => '<p class="text-center">Não foram encontradas correções de código a serem feitas.</p>', 'icon' => $this->getIcon('success')];
		} else {
			$correctionsList = implode('<br>', $corrections);
			return  ['result' => "<p>Foram encontradas as seguintes correções de código a serem feitas:<p>$correctionsList", 'icon' => $this->getIcon('danger')];
		}
	}

	private function getCorrections(): array
	{
		$corrections = [];

		foreach ($this->getPhpFiles() as $filePath) {
			$filename = basename($filePath);

			if (
				strpos($filePath, 'vendor/') !== false || // Ignora arquivos na pasta vendor
				pathinfo($filename, PATHINFO_EXTENSION) !== 'php' || // Verifica extensão do arquivo
				$filename === 'migrationChecker.php' // Ignora arquivo migration_checker.php
			) {
				continue;
			}

			$content = file_get_contents($filePath);
			$lines = explode("\n", $content);

			foreach (self::CORRECTIONS as $incorrect => $correct) {
				$lineNumber = null;

				foreach ($lines as $index => $line) {
					if (strpos($line, $incorrect) !== false) {
						$lineNumber = $index + 1;
						break;
					}
				}

				if ($lineNumber !== null) {
					$corrections[] = "<div class='d-flex text-body-secondary'>
					<div class='pb-1 border-bottom w-100'>
							<span class='text-gray-dark'>Na linha <code>$lineNumber</code>, do arquivo: <code>$filePath</code>.</span>
							<span class='d-block'>Substituir <kbd>$incorrect</kbd> por <kbd>$correct</kbd></span>
						</div>
					</div>";
				}
			}
		}

		return $corrections;
	}

	private function getPhpFiles(): array
	{
		$phpFiles = [];
		$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->rootDirectory));
		foreach ($iterator as $file) {
			if ($file->isFile() && $file->getExtension() === 'php' && $file->getFilename() !== 'migration_checker.php') {
				$phpFiles[] = $file->getPathname();
			}
		}
		return $phpFiles;
	}
}
$checker = new MigrationChecker();
?>

<!doctype html>
<html lang="pt-br" data-bs-theme="auto">

<head>
	<script src="https://getbootstrap.com/docs/5.3/assets/js/color-modes.js"></script>

	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="icon" type="image/png" href="https://sejaefi.com.br/images/favicon/favicon-16x16.png">
	<meta name="description" content="Validador de Migração da SDK Efí">
	<meta name="author" content="Guilherme Cota">
	<title>SDK PHP Migration Checker</title>

	<link href="https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet">

	<meta name="theme-color" content="#f37021">

	<style>
		/*
		* LOADING 
		*/
		body.loading:after {
			content: "";
			position: absolute;
			right: 0;
			top: 0;
			width: 100vw;
			height: 100vh;
			background: #242939;
		}

		body.loading:before {
			content: "";
			position: absolute;
			display: flex;
			width: 100vw;
			height: 100vh;
			align-content: center;
			justify-content: space-around;
			align-items: center;
			background: url('https://raw.githubusercontent.com/efipay/comunidade-discord-efi/main/assets/img/logo-efi-footer.svg') #242939 no-repeat center center;
			background-size: 130px;
			animation: flash 1s linear infinite;
			z-index: 9;
		}

		@keyframes flash {
			50% {
				opacity: 0;
			}
		}

		.hiddenOverflow {
			overflow: hidden;
		}

		/* /LOADING */

		.btn-bd-primary {
			--bd-violet-bg: #f37021;
			--bd-violet-rgb: 206, 101, 37;

			--bs-btn-font-weight: 600;
			--bs-btn-color: var(--bs-white);
			--bs-btn-bg: var(--bd-violet-bg);
			--bs-btn-border-color: var(--bd-violet-bg);
			--bs-btn-hover-color: var(--bs-white);
			--bs-btn-hover-bg: #dd6b26;
			--bs-btn-hover-border-color: #dd6b26;
			--bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
			--bs-btn-active-color: var(--bs-btn-hover-color);
			--bs-btn-active-bg: #ce6525;
			--bs-btn-active-border-color: #ce6525;
		}

		h1 {
			color: #f37021;
		}

		.btn-efi-primary {
			cursor: pointer;
			align-items: center;
			justify-content: center;
			border-radius: 0.8rem;
			--tw-bg-opacity: 1;
			background-color: rgb(0 128 157/1);
			padding: 10px 35px;
			font-weight: 400;
			letter-spacing: 0.5px;
			line-height: 2rem;
			--tw-text-opacity: 1;
			color: rgb(255 255 255/1);
			--tw-shadow: 0px 4px 24px rgba(0, 0, 0, .08), 0px 0px 4px rgba(0, 0, 0, .08), 0px 0px 16px rgba(0, 0, 0, .08);
			--tw-shadow-colored: 0px 4px 24px var(--tw-shadow-color), 0px 0px 4px var(--tw-shadow-color), 0px 0px 16px var(--tw-shadow-color);
			box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
			transition-duration: .15s;
			transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
			transition-timing-function: cubic-bezier(.4, 0, .2, 1);
		}

		.btn-efi-primary:hover {
			background-color: #006177;
			color: rgb(255 255 255/1);
		}

		.btn-efi-outline-primary {
			cursor: pointer;
			align-items: center;
			justify-content: center;
			border-radius: 0.8rem;
			--tw-bg-opacity: 1;
			background-color: rgb(255 255 255/1);
			padding: 10px 35px;
			font-weight: 400;
			letter-spacing: 0.5px;
			line-height: 2rem;
			--tw-text-opacity: 1;
			color: rgb(0 128 157/1);
			--tw-shadow: 0px 4px 24px rgba(0, 0, 0, .08), 0px 0px 4px rgba(0, 0, 0, .08), 0px 0px 16px rgba(0, 0, 0, .08);
			--tw-shadow-colored: 0px 4px 24px var(--tw-shadow-color), 0px 0px 4px var(--tw-shadow-color), 0px 0px 16px var(--tw-shadow-color);
			box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
			transition-duration: .15s;
			transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
			transition-timing-function: cubic-bezier(.4, 0, .2, 1);
		}

		.btn-efi-outline-primary:hover {
			background-color: #006177;
			color: rgb(255 255 255/1);
		}

		.b-divider {
			width: 100%;
			height: 3rem;
			background-color: rgba(0, 0, 0, .1);
			border: solid rgba(0, 0, 0, .15);
			border-width: 1px 0;
			box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
		}
	</style>

	<script>
		window.onload = function() {
			var html = document.querySelector('html');
			var body = document.querySelector('body');

			body.classList.remove("loading");
			html.classList.remove("hiddenOverflow");
		};
	</script>
</head>

<body class="loading hiddenOverflow">
	<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
		<symbol id="check2" viewBox="0 0 16 16">
			<path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z" />
		</symbol>
		<symbol id="circle-half" viewBox="0 0 16 16">
			<path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z" />
		</symbol>
		<symbol id="moon-stars-fill" viewBox="0 0 16 16">
			<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z" />
			<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z" />
		</symbol>
		<symbol id="sun-fill" viewBox="0 0 16 16">
			<path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z" />
		</symbol>
	</svg>

	<div class="dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle">
		<button class="btn btn-bd-primary py-2 dropdown-toggle d-flex align-items-center" id="bd-theme" type="button" aria-expanded="false" data-bs-toggle="dropdown" aria-label="Toggle theme (auto)">
			<svg class="bi my-1 theme-icon-active" width="1em" height="1em">
				<use href="#circle-half"></use>
			</svg>
			<span class="visually-hidden" id="bd-theme-text">Toggle theme</span>
		</button>
		<ul class="dropdown-menu dropdown-menu-end shadow" aria-labelledby="bd-theme-text">
			<li>
				<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
					<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em">
						<use href="#sun-fill"></use>
					</svg>
					Light
					<svg class="bi ms-auto d-none" width="1em" height="1em">
						<use href="#check2"></use>
					</svg>
				</button>
			</li>
			<li>
				<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
					<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em">
						<use href="#moon-stars-fill"></use>
					</svg>
					Dark
					<svg class="bi ms-auto d-none" width="1em" height="1em">
						<use href="#check2"></use>
					</svg>
				</button>
			</li>
			<li>
				<button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
					<svg class="bi me-2 opacity-50 theme-icon" width="1em" height="1em">
						<use href="#circle-half"></use>
					</svg>
					Auto
					<svg class="bi ms-auto d-none" width="1em" height="1em">
						<use href="#check2"></use>
					</svg>
				</button>
			</li>
		</ul>
	</div>

	<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
		<symbol id="check" viewBox="0 0 16 16">
			<title>Check</title>
			<path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z" />
		</symbol>
	</svg>

	<header>
		<nav class="container d-flex flex-wrap justify-content-center py-3 mb-2">
			<a href="/" class="d-flex align-items-center link-body-emphasis text-decoration-none">
				<img style="height: 40px;" src="https://dev.efipay.com.br/img/logo-efi-pay.svg" alt="Logo Efí Bank">
			</a>

			<div class="d-inline-flex mt-2 mt-md-0 ms-md-auto">
				<a href="https://dev.efipay.com.br/" target="_blank" class="me-3 py-2 link-body-emphasis text-decoration-none">Documentação</a>
				<a href="https://comunidade.sejaefi.com.br/" target="_blank" class="me-3 py-2 link-body-emphasis text-decoration-none">Discord</a>
				<a href="https://github.com/efipay/" target="_blank" class="me-3 py-2 link-body-emphasis text-decoration-none">Github</a>
			</div>
		</nav>

		<div class="b-divider"></div>

		<div class="container pricing-header p-3 pb-md-4 mx-auto text-center">
			<h1>Validador de Migração SDK PHP</h1>
			<p class="fs-5 text-body-secondary">O Validador de Migração da SDK Efí Pay é uma ferramenta
				desenvolvida para facilitar o processo de atualização da sua integração com a nova SDK de PHP da Efí Pay.
				Essa ferramenta analisa o seu código existente em busca de padrões específicos relacionados a
				classes e métodos que foram modificados na nova versão da SDK.</p>
			<button type="button" class="btn btn-efi-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
				Mais detalhes
				<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-list-check" viewBox="0 0 16 16">
					<path fill-rule="evenodd" d="M5 11.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zM3.854 2.146a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 3.293l1.146-1.147a.5.5 0 0 1 .708 0zm0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 7.293l1.146-1.147a.5.5 0 0 1 .708 0zm0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 0 1 .708-.708l.146.147 1.146-1.147a.5.5 0 0 1 .708 0z" />
				</svg>
			</button>
			<a href="" onclick="location.reload()" class="btn btn-efi-outline-primary">
				Atualizar resultados <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 18 18">
					<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z" />
					<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z" />
				</svg>
			</a>
		</div>
	</header>

	<main class="container">
		<div class="row row-cols-1 row-cols-md-3 mb-3 text-center">
			<div class="col">
				<div class="card mb-4 rounded-3 shadow-sm">
					<?php $resultPhp =  $checker->checkPHPVersion(); ?>
					<div class="card-header py-3">
						<h4 class="my-0 fw-normal">Versão do PHP <?php echo $resultPhp['version']  . ' ' . $resultPhp['icon']; ?></h4>
					</div>
					<div class="card-body">
						<?= $resultPhp['result'] ?>
					</div>
				</div>
			</div>
			<div class="col">
				<div class="card mb-4 rounded-3 shadow-sm">
					<?php $resultSdk =  $checker->checkSDKInstallation(); ?>
					<div class="card-header py-3">
						<h4 class="my-0 fw-normal">Versao da SDK <?= $resultSdk['icon'] ?></h4>
					</div>
					<div class="card-body text-cente">
						<?= $resultSdk['result']; ?>
					</div>
				</div>
			</div>
			<div class="col">
				<div class="card mb-4 rounded-3 shadow-sm">
					<?php $resultPackages =  $checker->checkRequiredPackages(); ?>
					<div class="card-header py-3">
						<h4 class="my-0 fw-normal">Dependências necessárias <?= $resultPackages['icon'] ?></h4>
					</div>
					<div class="card-body">
						<?= $resultPackages['result'] ?>
					</div>
				</div>
			</div>
		</div>

		<div class="card bg-body rounded shadow-sm border mb-4">
			<?php $resultCorrections =  $checker->checkCodeCorrections(); ?>
			<div class="card-header py-3 d-flex justify-content-between align-items-center">
				<h4 class="card-title my-0 fw-normal text-center flex-grow-1">Resultados <?= $resultCorrections['icon'] ?></h4>
			</div>


			<div class="p-3">
				<?= $resultCorrections['result'] ?>
			</div>
		</div>

		<!-- Modal -->
		<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
			<div class="modal-dialog modal-xl">
				<div class="modal-content">
					<div class="modal-header">
						<h1 class="modal-title fs-4 text-center" id="exampleModalLabel">Validador de migração</h1>
						<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
					</div>
					<div class="modal-body">
						<h5>Como Funciona:</h5>
						<ol>
							<li>
								<strong>Requisitos de Ambiente:</strong> Verifica se o seu ambiente atende aos requisitos
								necessários, como versão do PHP e pacotes instalados.
							</li>
							<li>
								<strong>Verificação de Código:</strong> Varre seus arquivos em busca de trechos de código
								que precisam ser atualizados de acordo com as novas convenções e estruturas da SDK.
							</li>
						</ol>

						<h5>Sobre a Execução do Validador:</h5>
						<ul>
							<li>
								Antes de usar o Validador de Migração, é importante compreender que sua execução não garante automaticamente o funcionamento perfeito da SDK em sua aplicação.
							</li>
							<li>
								O validador ajuda a identificar potenciais problemas de migração e oferece sugestões de correção, mas é essencial lembrar que cada aplicação é única e pode ter peculiaridades que não podem ser abordadas automaticamente.
							</li>
							<li>
								Após realizar as correções sugeridas, é altamente recomendado realizar testes extensivos em sua aplicação para validar o funcionamento adequado da SDK.
							</li>
						</ul>

						<h5>Backup Antes das Modificações:</h5>
						<ul>
							<li>
								Antes de realizar qualquer modificação no código de sua aplicação, é altamente aconselhável fazer um backup completo de todo o projeto.
							</li>
							<li>
								Modificações no código podem ter impactos imprevistos e é essencial ter uma cópia de segurança para restaurar caso algo não ocorra como esperado.
							</li>
							<li>
								Lembre-se de que as modificações de código são de responsabilidade do usuário e não nos responsabilizamos por quaisquer alterações feitas na aplicação.
							</li>
						</ul>

						<h5>Como Usar o Validador:</h5>
						<ol>
							<li>
								Certifique-se de inserir este arquivo <code>migrationChecker.php</code> no diretório raiz do seu projeto.
							</li>
							<li>
								Certifique-se de inserir corretamente o caminho para os arquivos <code>composer.json</code> e <code>installed.json</code>.
							</li>
							<li>
								Execute o Validador de Migração, que analisará seus arquivos em busca de problemas.
							</li>
							<li>
								Revise os resultados apresentados, identificando os trechos de código que precisam ser
								atualizados.
							</li>
							<li>
								Realize as correções recomendadas, seguindo as instruções exibidas.
							</li>
						</ol>
						<p>O Validador de Migração da SDK Efí Pay torna o processo de migração mais suave e <b>eficiente</b>,
							permitindo que você aproveite os novos recursos da SDK de forma mais rápida e segura.</p>
					</div>
					<div class="modal-footer">
						<button type="button" class="btn btn-efi-primary px-5" data-bs-dismiss="modal">Fechar</button>
					</div>
				</div>
			</div>
		</div>

		<script src="https://getbootstrap.com/docs/5.3/dist/js/bootstrap.bundle.min.js"></script>
</body>

</html>