<?php

$loader = $this->registry->get('load');
$loader->controller('payment/payment_info');

class ControllerPaymentPayPal extends ControllerPaymentPaymentInfo
{

  public function __construct($registry)
  {
    parent::__construct($registry);
    $this->paymentInfo = new PaymentInfo();
    $this->paymentInfo->clearParams();
  }

  public function external_checkout()
  {
    /*Checkout no ambiente do paypal com botões deles(Smart Buttons) que redirecionam para o pagamento */
    $this->load->dmodel('checkout/order');
    $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
    $this->load->helper('ftr_geral'); 
       
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/paypal/checkoutbuttons.twig')) {
      $this->template = $this->config->get('config_template') . '/template/payment/paypal/checkoutbuttons.twig';
    } else {
      $this->template = 'default/template/payment/paypal/checkoutbuttons.twig';
    }

    $this->response->setOutput($this->render());

  }

  public function createOrderPaypal(){
    /* Cria o pedido do paypal e retorna as infos para abrir a janela de pagamento */
    $this->load->language('payment/paypal');
    $this->load->dmodel('checkout/order');
    $this->load->model('payment/paypal');

    $retorno = array();

    $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
    if (isset($order_info)){
      /* paypal_info serve para caso cliente feche a janela do paypal não gere um novo pedido, a validação de valor é para gerar o pedido caso cliente edite algo que mude o total */
      if ( isset($this->session->data['paypal_info']) && ($this->session->data['paypal_info']->result->purchase_units[0]->amount->value == number_format((float)$order_info['total'], 2 ,'.','')) ){
        $retorno = $this->session->data['paypal_info'];
      }else{
        $order_info['products'] = $this->dmodel_checkout_order->getOrderItems($this->session->data['order_id']);
        $order_info['totals'] = $this->dmodel_checkout_order->getOrderTotals($this->session->data['order_id']);

        $retorno = $this->paypal->createOrder($order_info);

        $this->model_payment_paypal->setCheckoutOrderHistory($this->session->data['order_id'], $retorno->result->status);
      }

      $this->session->data['paypal_info'] = $retorno;

    }else{
      $retorno['error'] = $this->lenguage->get('error_not_order');
    }
    $this->response->setOutput(json_encode($retorno));
  }

  public function returnPaypalCheckout(){
    /* Trata o retorno do pagamento do paypal (Botões) */
    $retorno = array();
    $this->load->model('payment/paypal');
    $this->load->language('payment/paypal');
    $this->load->helper('Ftr_sql');
    $this->load->dmodel('checkout/order');
    $this->load->type('tipopaypal');

    try{
      if ($this->config->get('paypal_debug')){
        $this->paypal->setLogPaypal($this->request->post);
      }
      if (isset($this->request->post['status'])){
        if (isset($this->session->data['order_id'])){
          $order_id = $this->session->data['order_id'];
        }else{
          $order_id = $this->model_payment_paypal->getOrderIdByIntegracao($this->request->post['id']);
        }

        if($this->request->post['status']==Type_StatusOrderPaypal::Tp_Completed){
          /* Feito isso pois o intent(que identifica o tipo de transação que eu desejo), é passado como "capture" então o pagamento sendo aprovado
          já vira como capturado(completo), porém estruturalmente precisamos do apovado. */
          $this->model_payment_paypal->setCheckoutOrderHistory($order_id, Type_StatusOrderPaypal::Tp_Approved ,true);
        }      

        $this->model_payment_paypal->setCheckoutOrderHistory($order_id, $this->request->post['status'], true);

        $sqlUpdParam = Ftr_sql::generateUpdate('oc_order', ['codigo_integracao_pagamento'], 'order_id = ' . $order_id);
        $this->db->executeSql($sqlUpdParam, [$this->request->post['id']]);

        unset($this->session->data['paypal_info']);

        $retorno['redirect'] = $this->url->link('checkout/success');
      }else{
        $retorno['error'] = $this->language->get('error_post_order');
      }
    }catch(Exception $e){
      $logData = [
          'event'    => 'PaymentPaypal::returnPaypalCheckout',
          'exception'=> [
              'type'    => get_class($e),
              'message' => $e->getMessage(),
              'code'    => $e->getCode(),
              'file'    => $e->getFile(),
              'line'    => $e->getLine(),
              'trace'   => $e->getTraceAsString()
          ],
          'datetime' => date('c'), // data/hora no padrão ISO
      ];
      $this->log->write(json_encode($logData, JSON_UNESCAPED_UNICODE));
      $retorno['error'] = $e->getMessage();
    }

    $this->response->setOutput(json_encode($retorno));
  }




}
