<?php

use GN_Includes\Gerencianet_I18n;

function init_gerencianet_pix() {
	if ( ! class_exists( 'WC_Payment_Gateway' ) ) {
		return;
	};

	class WC_Gerencianet_Pix extends WC_Payment_Gateway {

		// payment gateway plugin ID
		public $id;
		public $has_fields;
		public $method_title;
		public $method_description;
		public $supports;
		// evitando falhas
		public $gerencianetSDK;
		public $gn_pix_key;
		public $gn_certificate_file;
		public $gn_pix_discount;
		public $gn_pix_discount_shipping;
		public $gn_pix_number_hours;
		public $gn_pix_mtls;
		public $gn_sandbox;
		public $gn_order_status_after_payment;

		public function __construct() {
			$this->id                 = GERENCIANET_PIX_ID; // payment gateway plugin ID
			$this->has_fields         = true; // custom form
			$this->method_title       = __( 'Efí - PIX', Gerencianet_I18n::getTextDomain() );
			$this->method_description = __( 'Com a Efí você pode receber pagamentos via Pix', Gerencianet_I18n::getTextDomain() );

			$this->supports = array(
				'products',
				'refunds',
			);

			$this->init_form_fields();

			$this->gerencianetSDK = new Gerencianet_Integration();

			$discountText = '';
			if ( $this->get_option( 'gn_pix_discount' ) != '' && $this->get_option( 'gn_pix_discount' ) != '0' ) {
				$discountText = ' - ' . $this->get_option( 'gn_pix_discount' ) . '% de Desconto';
			}

			// Load the settings.
			$this->init_settings();
			$this->title       = __( 'Pix', Gerencianet_I18n::getTextDomain() ) . $discountText;
			$this->description = __( 'Pagando por Pix, seu pagamento será confirmado em poucos segundos.', Gerencianet_I18n::getTextDomain() );
			$this->enabled     = $this->get_option( 'gn_pix' );

			$this->gn_pix_key                    = sanitize_text_field( $this->get_option( 'gn_pix_key' ) );
			$this->gn_certificate_file           = sanitize_text_field( $this->get_option( 'gn_certificate_file' ) );
			$this->gn_pix_discount          	 = sanitize_text_field( $this->get_option( 'gn_pix_discount' ) );
			$this->gn_pix_discount_shipping 	 = sanitize_text_field( $this->get_option( 'gn_pix_discount_shipping' ) );
			$this->gn_pix_number_hours      	 = sanitize_text_field( $this->get_option( 'gn_pix_number_hours' ) );
			$this->gn_pix_mtls              	 = sanitize_text_field( $this->get_option( 'gn_pix_mtls' ) );
			$this->gn_sandbox               	 = sanitize_text_field( $this->get_option( 'gn_sandbox' ) );
			$this->gn_order_status_after_payment = sanitize_text_field($this->get_option('gn_order_status_after_payment'));

			// // This action hook saves the settings
			add_action( 'woocommerce_update_options_payment_gateways_' . GERENCIANET_PIX_ID, array( $this, 'process_admin_options' ) );
			add_action( 'woocommerce_update_options_payment_gateways_' . GERENCIANET_PIX_ID, array( $this, 'savePixCertificate' ) );
			add_action( 'woocommerce_update_options_payment_gateways_' . GERENCIANET_PIX_ID, array( $this, 'registerWebhook' ) );

			add_action( 'woocommerce_api_' . strtolower( GERENCIANET_PIX_ID ), array( $this, 'webhook' ) );

			// This hook add the "view payment methods" button
			add_action( 'woocommerce_admin_order_data_after_billing_address', array( $this, 'add_view_payment_methods' ) );

			add_filter( 'woocommerce_my_account_my_orders_actions', array($this, 'substituir_link_pagar'), 10, 2 );
		}

		public function process_refund( $order_id, $amount = null, $reason = '' ) {

			try {
				$res   = $this->gerencianetSDK->pix_refund( $order_id, $amount );
				$order = wc_get_order( $order_id );
				$order->update_status( 'refunded' );
				return $res;
			} catch ( Error $e ) {
				throw $e;
			}

		}

		public function savePixCertificate() {
			$file_name = $_FILES['woocommerce_wc_gerencianet_pix_gn_certificate_file']['name'];
			
			if ( $_FILES['woocommerce_wc_gerencianet_pix_gn_certificate_file']['error'] != 0 ) {
				return;
			}
			
			// get the file extension
			$fileExt       = explode( '.', $file_name );
			$fileActualExt = strtolower( end( $fileExt ) );
			$file_read = null;
			
			switch ($fileActualExt) {
				case 'pem':
					if ( ! $file_read = file_get_contents( $_FILES['woocommerce_wc_gerencianet_pix_gn_certificate_file']['tmp_name'] ) ) { // Pega o conteúdo do arquivo
						echo '<div class="error"><p><strong> Falha ao ler arquivo o Certificado Pix! </strong></div>';
						return;
					}
					break;
				case 'p12':
					if ( ! $cert_file_p12 = file_get_contents( $_FILES['woocommerce_wc_gerencianet_pix_gn_certificate_file']['tmp_name'] ) ) { // Pega o conteúdo do arquivo
						echo '<div class="error"><p><strong> Falha ao ler arquivo o Certificado Pix! </strong></div>';
						return;
					}
					if ( ! openssl_pkcs12_read( $cert_file_p12, $cert_info_pem, '' ) ) { // Converte o conteúdo para .pem
						echo '<div class="error"><p><strong> Falha ao converter o arquivo .p12! </strong></div>';
						return;
					}
					$file_read  = "";
					$file_read .= $cert_info_pem['cert'];
					$file_read .= "Key Attributes: <No Attributes>\n";
					$file_read .= $cert_info_pem['pkey'];
					break;
				default:
					echo '<div class="error"><p><strong> Certificado Pix inválido! </strong></div>';
					return;
			}
			if ( isset( $file_read ) ) {
				$this->update_option( 'gn_certificate_file_name', str_replace('p12', 'pem', $file_name) );
				$this->update_option( 'gn_certificate_file', $file_read );
			} else{
				$this->update_option( 'gn_certificate_file_name', 'Nenhum certificado salvo');
			}

		}

		public function init_form_fields() {
			
			$certificateLabel = $this->get_option( 'gn_certificate_file_name') != 'Nenhum certificado salvo' ? 'Certificado salvo: '.$this->get_option( 'gn_certificate_file_name' ) : $this->get_option( 'gn_certificate_file_name' );

			$this->form_fields = array(
				'gn_api_section'                => array(
					'title'       => __( 'Credenciais Efí', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'title',
					'description' => __( "<a href='https://gerencianet.com.br/artigo/como-obter-chaves-client-id-e-client-secret-na-api/#versao-7' target='_blank'>Clique aqui para obter seu Client_Id e Client_Secret! </a>", Gerencianet_I18n::getTextDomain() ),
				),
				'gn_client_id_production'       => array(
					'title'       => __( 'Client_Id Produção', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Por favor, insira seu Client_Id. Isso é necessário para receber o pagamento.', Gerencianet_I18n::getTextDomain() ),
					'default'     => '',
				),
				'gn_client_secret_production'   => array(
					'title'       => __( 'Client_Secret Produção', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Por favor, insira seu Client_Secret. Isso é necessário para receber o pagamento.', Gerencianet_I18n::getTextDomain() ),
					'default'     => '',
				),
				'gn_client_id_homologation'     => array(
					'title'       => __( 'Client_Id Homologação', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Por favor, insira seu Client_Id de Homologação. Isso é necessário para testar os pagamentos.', Gerencianet_I18n::getTextDomain() ),
					'default'     => '',
				),
				'gn_client_secret_homologation' => array(
					'title'       => __( 'Client_Secret Homologação', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Por favor, insira seu Client_Secret de Homologação. Isso é necessário para testar os pagamentos.', Gerencianet_I18n::getTextDomain() ),
					'default'     => '',
				),
				'gn_sandbox_section'            => array(
					'title'       => __( 'Ambiente Sandbox', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'title',
					'description' => 'Habilite para usar o ambiente de testes da Efí. Nenhuma cobrança emitida nesse modo poderá ser paga.',
				),
				'gn_sandbox'                    => array(
					'title'   => __( 'Sandbox', Gerencianet_I18n::getTextDomain() ),
					'type'    => 'checkbox',
					'label'   => __( 'Habilitar o ambiente sandbox', Gerencianet_I18n::getTextDomain() ),
					'default' => 'no',
				),
				'gn_one_payment_section'        => array(
					'title' => __( 'Configurações de recebimento', Gerencianet_I18n::getTextDomain() ),
					'type'  => 'title',
				),
				'gn_pix'                        => array(
					'title'   => __( 'Pix', Gerencianet_I18n::getTextDomain() ),
					'type'    => 'checkbox',
					'label'   => __( 'Habilitar Pix', Gerencianet_I18n::getTextDomain() ),
					'default' => 'no',
				),
				'gn_pix_key'                    => array(
					'title'       => __( 'Chave Pix', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Insira sua chave Pix da Efí', Gerencianet_I18n::getTextDomain() ),
					'desc_tip'    => false,
					'placeholder' => '',
					'default'     => '',
				),
				'gn_hmac'                   => array(
					'title'       => __( 'HMAC do Webhook', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'text',
					'description' => __( 'Insira o HMAC que será usado no webhook.', Gerencianet_I18n::getTextDomain() ),
					'desc_tip'    => false,
					'placeholder' => '',
					'default'     => $this->generate_hmac(),
				),
				'gn_certificate_file'                   => array(
					'title'       => __( 'Certificado Pix', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'file',
					'description' => $certificateLabel,
					'desc_tip'    => false,
				),
				'gn_pix_discount'               => array(
					'title'       => __( 'Desconto no Pix', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'number',
					'description' => __( 'Desconto a ser aplicado para pagamentos com Pix. (Deixe em branco ou como 0 para não aplicar desconto)', Gerencianet_I18n::getTextDomain() ),
					'placeholder' => '0',
					'default'     => '0',
				),
				'gn_pix_discount_shipping'      => array(
					'title'       => __( 'Modo de desconto', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'select',
					'description' => __( 'Escolha como aplicar o desconto definido na opção anterior.', Gerencianet_I18n::getTextDomain() ),
					'default'     => 'total',
					'options'     => array(
						'total'    => __( 'Aplicar desconto no valor total com Frete', Gerencianet_I18n::getTextDomain() ),
						'products' => __( 'Aplicar desconto apenas no preço dos produtos', Gerencianet_I18n::getTextDomain() ),
					),
				),
				'gn_pix_number_hours'           => array(
					'title'       => __( 'Expiração do pix', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'number',
					'description' => __( 'Em quantas horas o Pix expira depois de emitido', Gerencianet_I18n::getTextDomain() ),
					'placeholder' => '0',
					'default'     => '24',
				),
				'gn_pix_mtls'                   => array(
					'title'       => __( 'Validar mTLS', Gerencianet_I18n::getTextDomain() ),
					'type'        => 'checkbox',
					'description' => __( 'Entenda os riscos de não configurar o mTLS <a href="https://dev.gerencianet.com.br/docs/api-pix-endpoints#webhooks" target="_blank">clicando aqui.</a>', Gerencianet_I18n::getTextDomain() ),
					'default'     => 'no',
				),
				'gn_order_status_after_payment' => array(
					'title'       => __( 'Status do pedido após pagamento', 'text-domain' ),
					'type'        => 'select',
					'description' => __( 'Selecione o status do pedido após a confirmação do pagamento.', 'text-domain' ),
					'desc_tip'    => true,
					'options'     => wc_get_order_statuses(), // Obtém os status de pedido disponíveis
					'default'     => 'wc-processing', // Define um status padrão, ex: 'wc-processing'
				),
				'webhook_button' => array(
					'title'             => __( 'Webhook', Gerencianet_I18n::getTextDomain() ),
					'type'              => 'button',
					'description'       => __( $this->get_option('webhook_status'), Gerencianet_I18n::getTextDomain() ),
					'default'           => __( 'Cadastrar Webhook', Gerencianet_I18n::getTextDomain() ),
					'custom_attributes' => array(
						'onclick' => 'location.href="' . admin_url('admin-post.php?action=register_webhook&method='.GERENCIANET_PIX_ID) . '";',
					),
				),
				'download_button' => array(
					'title'             => __( 'Baixar Logs', Gerencianet_I18n::getTextDomain() ),
					'type'              => 'button',
					'description'       => __( 'Clique para baixar os logs de emissão de cobranças via Pix.', Gerencianet_I18n::getTextDomain() ),
					'default'           => __( 'Baixar Logs', Gerencianet_I18n::getTextDomain() ),
					'custom_attributes' => array(
						'onclick' => 'location.href="' . admin_url('admin-post.php?action=gn_download_logs&log=wc_gerencianet_pix') . '";',
					),
				),
			);
			
		}

		public function process_admin_options() {
			parent::process_admin_options();
		}

		private function generate_hmac() {

			$client_secret = $this->gn_sandbox === 'yes'
				? $this->get_option( 'gn_client_secret_homologation' )
				: $this->get_option( 'gn_client_secret_production' );
			$ip_address   = $_SERVER['SERVER_ADDR'] ?? '127.0.0.1';
			$last_8_chars = substr( $client_secret, -8 );
			$expected_hmac = hash( 'sha256', $last_8_chars . $ip_address );

			return $expected_hmac;
		}
		
		public function payment_fields() {
			if ( $this->description ) {
				echo wpautop( wp_kses_post( $this->description ) );
			}

			if(intval( $this->get_option( 'gn_pix_discount' ) ) > 0){
				$discountMessage = '';
				if ( $this->get_option( 'gn_pix_discount_shipping' ) == 'total' ) {
					$discountMessage = ' no valor total da compra (frete incluso)';
				}else{
					$discountMessage = ' no valor total dos produtos (frete não incluso)';
				}
				
				$discountWarn = '<div class="warning-payment" id="wc-gerencianet-messages-sandbox">
										<div class="woocommerce-info">' .esc_html( $this->get_option( 'gn_pix_discount' ) ) . '% de Desconto'.$discountMessage. '</div>
									</div>';
				echo wpautop( wp_kses_post( $discountWarn ) );
			}

			$is_sandbox = $this->get_option( 'gn_sandbox' ) == 'yes' ? true : false;
			if ( $is_sandbox ) {
				$sandboxWarn = '<div class="warning-payment" id="wc-gerencianet-messages-sandbox">
                                    <div class="woocommerce-error">' . __( 'O modo Sandbox está ativo. As cobranças emitidas não serão válidas.', Gerencianet_I18n::getTextDomain() ) . '</div>
                                </div>';
				echo wpautop( wp_kses_post( $sandboxWarn ) );
			}

			echo '<fieldset id="wc-' . esc_attr( $this->id ) . '-cc-form" class="wc-credit-card-form wc-payment-form" style="background:transparent; border: none;">';

			?>
			<div class="form-row form-row-wide" id="gn_field_pix">
				<label>CPF/CNPJ</label>
				<input id="gn_pix_cpf_cnpj" class="input-text" inputmode="numeric" name="gn_pix_cpf_cnpj" type="text" placeholder="___.___.___-__" autocomplete="off" onkeypress="return event.charCode >= 48 && event.charCode <= 57">
			</div>
			<div class="clear"></div>
			<script src="<?php echo plugins_url( '../assets/js/vanilla-masker.min.js', plugin_dir_path( __FILE__ ) ); ?>"></script>
			<script src="<?php echo plugins_url( '../assets/js/scripts-pix.js', plugin_dir_path( __FILE__ ) ); ?>"></script>
			</fieldset>
			<?php
		}

		public function validate_fields() {
			if ( empty( sanitize_text_field( $_POST['gn_pix_cpf_cnpj'] ) ) ) {
				return true;
			} else {
				$cpf_cnpj = sanitize_text_field( $_POST['gn_pix_cpf_cnpj'] );
				if ( strlen( $cpf_cnpj ) == 11 ) {
					// cpf
					return Gerencianet_Validate::cpf( $cpf_cnpj );
				} else {
					// cnpj
					return Gerencianet_Validate::cnpj( $cpf_cnpj );
				}
			}
			return true;
		}

		public function process_payment( $order_id ) {
			global $woocommerce;

			$order = wc_get_order( $order_id );

			$types         = array( 'line_item', 'fee', 'shipping', 'coupon' );
			$value         = 0;
			$shippingTotal = 0;
			// get the Items
			foreach ( $order->get_items( $types ) as $item_id => $item ) {
				switch ( $item->get_type() ) {
					case 'fee':
						$value += $item->get_total();
						break;
					case 'shipping':
						$value += $item->get_total();
						$shippingTotal += $item->get_total();
						break;
					case 'coupon':
						$value -= $item->get_discount();
						break;
					case 'line_item':
						$product = $item->get_product();
						$value += $item->get_quantity() * $product->get_price();
						break;
					default:
						$product = $item->get_product();
						$value  += ( $item->get_quantity() * $product->get_price() );
						break;
				}
			}

			if($order->get_total_tax()>0) {
				$value += $order->get_total_tax();
			}
			
			$discount = 0;

			if ( $this->get_option( 'gn_pix_discount' ) != '' && $this->get_option( 'gn_pix_discount' ) != '0' ) {

				if ( $this->get_option( 'gn_pix_discount_shipping' ) == 'total' ) {
					$discount = ( ( $value ) * ( intval( $this->get_option( 'gn_pix_discount' ) ) / 100 ) );
					$discountMessage = ' no valor total da compra';
				} else {
					$discount = ( ( $value - $shippingTotal ) * ( intval( $this->get_option( 'gn_pix_discount' ) ) / 100 ) );
					$discountMessage = ' no valor total dos produtos (frete não incluso)';
				}
				
				$order_item_id = wc_add_order_item(
					$order_id,
					array(
						'order_item_name' => $this->get_option( 'gn_pix_discount' ) . __( '% de desconto no Pix' ).$discountMessage,
						'order_item_type' => 'fee',
					)
				);
				if ( $order_item_id ) {
					wc_add_order_item_meta( $order_item_id, '_fee_amount', -$discount, true );
					wc_add_order_item_meta( $order_item_id, '_line_total', -$discount, true );
					$order->set_total( $order->get_total() - ( $discount ) );
					$order->save();

				}
			}

			$value -= $discount;

			$cpf_cnpj = str_replace( '.', '', sanitize_text_field( $_POST['gn_pix_cpf_cnpj'] ) );
			$cpf_cnpj = str_replace( '-', '', $cpf_cnpj );
			$cpf_cnpj = str_replace( '/', '', $cpf_cnpj );
			
			if ( empty($cpf_cnpj) ) {
				$customer = null;
			} else {
				if ( Gerencianet_Validate::cpf( $cpf_cnpj ) ) {
				$customer = array(
					'nome' => $order->get_formatted_billing_full_name(),
					'cpf'  => $cpf_cnpj,
				);
				} elseif ( Gerencianet_Validate::cnpj( $cpf_cnpj ) ) {
					$customer = array(
						'nome' => $order->get_billing_company() != '' ? $order->get_billing_company() : $order->get_formatted_billing_full_name(),
						'cnpj' => $cpf_cnpj,
					);
				} else {
					wc_add_notice( __( 'CPF/CNPJ inválido.', Gerencianet_I18n::getTextDomain() ), 'error' );
					return false;
				}
			}

			

			$body = array(
				'calendario'     => array( 'expiracao' => intval( $this->get_option( 'gn_pix_number_hours' ) ) * 3600 ),
				'valor'          => array( 'original' => sprintf( '%0.2f', $value ) ),
				'chave'          => $this->get_option( 'gn_pix_key' ),
			);

			if ($customer != null) {
				$body['devedor'] = $customer;
			}

			$body['infoAdicionais'] = [];

			if(get_bloginfo() != ""){
				$body['infoAdicionais'] = array(
					array(
						'nome'  => 'Pagamento em',
						'valor' => get_bloginfo(),
					)
				);
			}
			
			array_push($body['infoAdicionais'],array('nome'  => 'Numero do Pedido','valor' => '#' . $order_id));

			try {
				$chargeResponse = $this->gerencianetSDK->pay_pix( $body );
				$charge         = json_decode( $chargeResponse, true );

				$qrCodeResponse = $this->gerencianetSDK->generate_qrcode( $charge['loc']['id'] );
				$qrCode         = json_decode( $qrCodeResponse, true );

				Gerencianet_Hpos::update_meta( $order_id, '_gn_pix_link', $qrCode['linkVisualizacao'] );
				Gerencianet_Hpos::update_meta( $order_id, '_gn_pix_qrcode', $qrCode['imagemQrcode'] );
				Gerencianet_Hpos::update_meta( $order_id, '_gn_pix_copy', $qrCode['qrcode'] );
				Gerencianet_Hpos::update_meta( $order_id, '_gn_pix_txid', $charge['txid'] );

				$order->update_status( 'pending-payment' );
				wc_reduce_stock_levels( $order_id );
				$woocommerce->cart->empty_cart();

				return array(
					'result'   => 'success',
					'redirect' => $this->get_return_url( $order ),
				);
			} catch ( Exception $e ) {
				wc_add_notice( $e->getMessage(), 'error' );
				return;
			}
		}

		public function webhook() {
			if ( isset( $_GET['hmac'] ) ) {
				$received_hmac = $_GET['hmac'];

				$expected_hmac = $this->get_option('gn_hmac');

				// Valida o HMAC
				if ( hash_equals( $expected_hmac, $received_hmac ) ) {
					header( 'HTTP/1.0 200 OK' );
					$this->successful_webhook( file_get_contents( 'php://input' ) );
				} else {
					header( 'HTTP/1.1 403 Forbidden' );
					gn_log( 'Não foi possível receber a notificação do Pix. HMAC INVÁLIDO.', GERENCIANET_PIX_ID );
				}
			} else {
				header( 'HTTP/1.1 400 Bad Request' );
				gn_log( 'Chamada de webhook sem HMAC.', GERENCIANET_PIX_ID );
			}
		}

		public function registerWebhook() {
			global $woocommerce;

			try {
				$pix_key  = $this->get_option( 'gn_pix_key' );
				$url      = strtolower( $woocommerce->api_request_url( GERENCIANET_PIX_ID ));
				$response = $this->gerencianetSDK->update_webhook( $pix_key, $url );
				$this->update_option("webhook_status", "O webhook foi cadastrado com sucesso!");
				WC_Admin_Settings::add_message("O webhook foi cadastrado com sucessol!");
			} catch ( \Throwable $th ) {
				$this->update_option("webhook_status", "O webhook ainda não foi cadastrado.");
				WC_Admin_Settings::add_error("Não foi possível cadastrar o webhook.");
				gn_log( $th, GERENCIANET_PIX_ID);
			}
		}

		public static function getMethodId() {
			return self::$id;
		}

		public function successful_webhook( $posted ) {
			$data = json_decode( $posted, true );
			$pix = $data['pix'] ?? [];
			if ( empty( $pix ) ) {
				exit();
			}
			
			// Percorre lista de notificações
			$args = array(
				'limit'        => -1,
				'orderby'      => 'date',
				'order'        => 'DESC',
				'meta_key'     => '_gn_pix_txid',
				'meta_compare' => '=',
				'meta_value'   => sanitize_text_field( $pix[0]['txid'] ),
			);

			// Busca pedidos
			$orders = wc_get_orders( $args );

			// Atualiza status
			foreach ( $orders as $order ) {

				if ( isset( $pix[0]['txid'] ) && $pix[0]['txid'] != '' && ( Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_txid', true ) == $pix[0]['txid'] ) ) {
					Gerencianet_Hpos::update_meta( intval( $order->get_id() ), '_gn_pix_E2EID', $pix[0]['endToEndId'], true );

					if ( isset( $pix[0]['devolucoes'] ) && $pix[0]['devolucoes'][0]['status'] == 'DEVOLVIDO' ) {
						$order->update_status( 'refunded' );
					} else {
						$order->update_status($this->gn_order_status_after_payment);
						$order->payment_complete();
					}
				}
			}

			exit();
		}

		public function add_view_payment_methods( $order ) {

			if ( $order->get_payment_method() != $this->id ) {
				return;
			}

			if ( Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_copy', true ) || Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_link', true ) ) {
				?>
					<style>

						.gngrid-container {
							display: grid;
							grid-template-columns: 50% 50%;
							overflow: hidden;
						}
						.gngrid-item {
							padding: 20px;
							font-size: 30px;
						}

						.gn-item-area {
							border-radius: 1.2rem;
							transition: transform 300ms ease;
						}

						.gn-item-area:hover {
							transform: scale(1.02);
						}

						.gn-btn{
							width: 100%;
							background: #EB6608 !important; 
							color:#ffff !important; 
							border:none;
							border-color: #EB6608 !important; 
							font-size: 1rem !important; 
							padding: 3px 5px 3px 5px !important;
						}
					</style>

			<script>

				function gncopy($field) {
					document.getElementById('gnpix').innerHTML = 'Copiado!';
					navigator.clipboard.writeText('<?php echo esc_html( Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_copy', true ) ); ?>');
					setTimeout(()=> {
							document.getElementById('gnpix').innerHTML = 'Copiar Pix Copia e Cola';
						},1000)
				}

				function viewGnInfos(params) {
					Swal.fire({
						title: 'Meios de Pagamento Disponíveis',
						icon: 'info',
						html: '<div class="gngrid-container"><div class="gngrid-item"><?php if ( Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_copy', true ) !== NULL ) { ?><div class="gn-item-area"><img style="width:150px;" src=" <?php echo esc_url(plugins_url( 'woo-gerencianet-official/assets/img/pix-copia.png' )); ?> " /><br> <a onclick="gncopy(2)" id="gnpix" class="button gn-btn">Copiar Pix Copia e Cola</a> </div><?php }?></div><div class="gn-item-area"><?php if ( Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_link', true ) !== NULL ) { ?> <div class="gngrid-item"><img style="width:150px;" src=" <?php echo esc_url(plugins_url( 'woo-gerencianet-official/assets/img/boleto-online.png' )); ?> " /><br><a href=" <?php echo esc_url(Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_link', true )); ?>  " target="_blank" class="button gn-btn">Acessar Pix Online</a></div> <?php }?> </div></div>',
						showCloseButton: true,
						showCancelButton: false,
						showConfirmButton: false
					})
				}
			</script>
			<div class="gn_payment_methods">
				<a onclick="viewGnInfos()" style="background: #EB6608; color:#ffff; border:none;" class="button">
					<span class="dashicons dashicons-visibility" style="margin-top:4px;"></span>
					<?php echo __( 'Visualizar Métodos de Pagamento', Gerencianet_I18n::getTextDomain() ); ?>
				</a>
			</div>

				<?php
			}
		}

		public function substituir_link_pagar( $actions, $order ) {
			if ( isset( $actions['pay'] ) ) {
				if(Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_link', true ) != null) {
					$actions['pay']['url'] = esc_url(Gerencianet_Hpos::get_meta( $order->get_id(), '_gn_pix_link', true ));;
				}
			}
			return $actions;
		}

		public function validate_gn_client_id_production_field( $key, $value ) {
        	if ( ! preg_match( '/^Client_Id_[a-zA-Z0-9]{40}$/', $value ) ) {
        		WC_Admin_Settings::add_error( 'Insira o Client_Id de Produção.' );
        		$this->update_option( 'gn_pix', 'no' );
        		$value = ''; // empty it because it is not correct
        	}
        
        	return $value;
        }
        
        public function validate_gn_client_secret_production_field( $key, $value ) {
            if ( ! preg_match( '/^Client_Secret_[a-zA-Z0-9]{40}$/', $value ) ) {
                WC_Admin_Settings::add_error( 'Insira o Client_Secret de Produção.' );
                $this->update_option( 'gn_pix', 'no' );
                $value = '';
            }
            return $value;
        }
        
        public function validate_gn_client_id_homologation_field( $key, $value ) {
        	if ( ! preg_match( '/^Client_Id_[a-zA-Z0-9]{40}$/', $value ) ) {
        		WC_Admin_Settings::add_error( 'Insira o Client_Id de Homologação.' );
        		$this->update_option( 'gn_pix', 'no' );
        		$value = ''; // empty it because it is not correct
        	}
        	return $value;
        }
        
        public function validate_gn_client_secret_homologation_field( $key, $value ) {
            if ( ! preg_match( '/^Client_Secret_[a-zA-Z0-9]{40}$/', $value ) ) {
                WC_Admin_Settings::add_error( 'Insira o Client_Secret de Homologação.' );
                $this->update_option( 'gn_pix', 'no' );
                $value = '';
            }
            return $value;
        }
	}
}
