<?php
/*******************************************************************************
 * Copyright (c) 2015 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

require_once("payment.class.php");
require_once("donation.class.php");
require_once("donationEmails.class.php");

/**
 * Base class for gateway class
 *
 * We currently have two supported gateway classes.
 * They are paypal or bitpay.
 *
 * @author chrisguindon
 *
 */
class PaymentGateway extends Payment {

 /**
  * Donation object
  */
  public $Donation = NULL;

 /**
  * Getway API key
  */
  protected $gateway_auth_token = '';

  /**
   * Gateway business e-mail address
   */
  protected $gateway_email = '';

  /**
   * Location of the gateway IPN script on our servers
   *
   * @var unknown
   */
  protected $gateway_notify_url = '';

  /**
   * Location of the donation preprocess form.
   *
   * This is the script that will redirect the user
   * to the proper donation based off certain criteria.
   *
   * @var unknown
   */
  protected $gateway_process_url = '';

  /**
   * Redirect url for process script.
   *
   * If possible, this url can be used to
   * automaticly redirect the user to the
   * payment gateway from the process script.
   *
   * @var unknown
   */
  protected $gateway_redirect = '';

  /**
   * Curl request response
   */
  protected $gateway_response = '';

  /**
   * Page where the user should when returning from payment gateway
   */
  protected $gateway_return_url = '';

  /**
   * Type of gateway
   *
   * This should probably set to bitpay or paypal
   * for now.
   */
  protected $gateway_type = "";

  /**
   * Payment gateway URL
   */
  protected $gateway_url = '';

  public function PaymentGateway()  {
    parent::__construct();
    $this->Donation = new Donation($this->_get_debug_mode());
    $this->_set_gateway_process_url('https://'. $this->_get_prefix_domain() . '/donate/process.php');
    $this->_set_gateway_return_url('https://'. $this->_get_prefix_domain() . '/donate/credit.php');
  }

  /**
   * Get gateway process url
   *
   * @return unknown
   */
  public function get_gateway_process_url() {
    return $this->gateway_process_url;
  }

  /**
   * Get gateway redirect value
   *
   * @return unknown
   */
  public function get_gateway_redirect() {
    if (empty($this->gateway_redirect)) {
      $this->_set_gateway_redirect();
    }
    return $this->gateway_redirect;
  }

  /**
   * Set a client message for returning bitpay donation
   */
  public function get_gateway_bitpay_thank_you() {
    $bitpay_return = $this->App->getHTTPParameter('bitpay_return', 'get');
    if ($bitpay_return == 'donation') {
      setcookie("thankyou_page[eclipse_donation]", TRUE, time() + (3600 * 24 * 360 * 10), '/', $this->_get_prefix_cookie());
      $this->set_client_message( '<strong>Thank you for your donation!</strong>', 'success');
    }
  }

  /**
   * Store form values from donation form or process script
   */
  public function update_friends_process_table($update = FALSE) {
    $fields = array(
      'id_unique' => $this->Donation->get_donation_random_invoice_id(),
      'uid' => $this->Donation->Donor->get_donor_uid(),
      'type' => $this->_get_gateway_type(),
      'domain' => $this->_get_prefix_domain(),
      'first_name' => $this->Donation->Donor->get_donor_first_name(),
      'last_name' => $this->Donation->Donor->get_donor_last_name(),
      'email' => $this->Donation->Donor->get_donor_email(),
      'amount' => $this->Donation->get_donation_amount(),
      'message' => $this->Donation->get_donation_message(),
      'subscription' => $this->Donation->get_donation_subscription(),
      'is_anonymous' => $this->Donation->get_donation_is_anonymous(),
      'redirect_url' => $this->get_gateway_redirect(),
      'status' => $this->Donation->get_donation_status(),
      'email_paypal' => $this->Donation->Donor->get_donor_paypal_email()
    );

    if ($update) {
      // On ipn update, we won't update the redirect_url
      unset($fields['redirect_url']);
    }

    $possible_null_field = array(
      'uid',
      'first_name',
      'last_name',
      'message',
      'email',
      'email_paypal',
      'amount',
      'domain'
    );

    $sql = $this->_sql_on_duplicate_update('friends_process', $fields, $possible_null_field);
    $this->App->eclipse_sql($sql);
  }

  public function set_posted_donation_values() {
    $this->Donation->Donor->set_donor_email($this->App->getHTTPParameter('email'));
    $this->Donation->Donor->set_donor_first_name($this->App->getHTTPParameter('first_name'));
    $this->Donation->Donor->set_donor_last_name($this->App->getHTTPParameter('last_name'));
    $this->Donation->set_donation_amount($this->App->getHTTPParameter('amount'));
    $this->Donation->set_donation_message($this->App->getHTTPParameter('message'));
    $this->Donation->set_donation_subscription($this->App->getHTTPParameter('subscription'));
    $this->Donation->set_donation_is_anonymous($this->App->getHTTPParameter('is_anonymous'));
    $this->Donation->set_donation_status('new_donation_form');
    $this->_set_gateway_redirect();
    $this->update_friends_process_table();
  }

  /**
   * Get gateway auth token.
   */
  protected function _get_gateway_auth_token(){
    if (empty($this->gateway_auth_token)) {
      $this->_set_gateway_auth_token();
    }
    return $this->gateway_auth_token;
  }

  /**
   * Get gateway business e-mail account
   */
  protected function _get_gateway_email() {
    return $this->gateway_email;
  }

  /**
   * Get gateway notify url
   *
   * @return string
   */
  protected function _get_gateway_notify_url() {
    return $this->gateway_notify_url;
  }

  /**
   * Get return URL
   *
   * @return unknown
   */
  protected function _get_gateway_return_url() {
    return $this->gateway_return_url;
  }

  /**
   * Get gateway redirect URL
   */
  protected function _get_gateway_redirect(){
    return $this->gateway_redirect;
  }

  /**
   * Get curl request response
   */
  protected function _get_gateway_response(){
    return $this->gateway_response;
  }

  /**
   * Get gateway type
   */
  protected function _get_gateway_type() {
   return $this->gateway_type;
  }

  /**
   * Get gateway URL
   *
   * @return unknown
   */
  protected function _get_gateway_url() {
    return $this->gateway_url;
  }

  /**
   * Set gateway auth token
   * @return string
   */
  protected function _set_gateway_auth_token($token = ""){
    $this->gateway_auth_token = $token;
  }

  /**
   * Set gateway business e-mail account
   *
   * @param unknown $email
   */
  protected function _set_gateway_email($email) {
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $this->gateway_email = $email;
    }
  }

  /**
   * Set gateway notify url
   *
   * @param string $url
   */
  protected function _set_gateway_notify_url($url = '') {
    if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->gateway_notify_url = $url;
    }
  }

  /**
   * Set gateway process url
   *
   * @param string $url
   */
 protected function _set_gateway_process_url($url = '') {
   if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->gateway_process_url = $url;
    }
  }

  /**
   * Set gateway redirect url
   *
   * @param string $url
   */
  protected function _set_gateway_redirect($url = NULL) {
    $this->gateway_redirect = $this->_get_gateway_url();
    if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->gateway_redirect = $url;
    }
  }

  /**
   * Set curl request response
   */
  protected function _set_gateway_response($res = ''){
    $this->gateway_response = $res;
  }

  /**
   * Set return URL
   *
   * @param string $url
   */
  protected function _set_gateway_return_url($url = NULL) {
    if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->gateway_return_url = $url;
    }
  }

  /**
   * Set gateway type
   *
   * @param string $gateway_type
   */
  protected function _set_gateway_type($gateway_type = NULL){
    $haystack = array('bitpay', 'paypal');
    if (in_array($gateway_type, $haystack)) {
      $this->gateway_type = $gateway_type;
      $this->Donation->set_donation_currency($gateway_type);
    }
  }

  /**
   * Set gateway URL
   *
   * @param string $url
   */
  protected function _set_gateway_url($url = NULL) {
    if (filter_var($url, FILTER_VALIDATE_URL)) {
      $this->gateway_url = $url;
    }
  }
}
