<?php
/*  Copyright 2014  Varun Sridharan  (email : varunsridharan23@gmail.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as 
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 
    Plugin Name: Woocommerce Quick Donation
    Plugin URI: http://varunsridharan.in/
    Description: Woocommerce Quick Donation
    Version: 1.2
    Author: Varun Sridharan
    Author URI: http://varunsridharan.in/
    License: GPL2
*/
defined('ABSPATH') or die("No script kiddies please!"); 
define( 'wc_qd_u', plugin_dir_url( __FILE__ ) );
define( 'wc_qd_p', plugin_dir_path( __FILE__ ) );

class wc_quick_donation{
	
	public $donation_id;
    private $plugin_v;
	
	/**
	 * Setup The Plugin Class
	 */
	function __construct() {
		$this->donation_id = get_option('wc_quick_donation_product_id');
        $this->plugin_v = '1.2';
		add_shortcode( 'wc_quick_donation', array($this,'shortcode_handler' ));
        
        add_action( 'post_row_actions', array($this,'protect_donation_product'),99,2);
        add_action( 'get_the_generator_html',  array($this,'generate_meta_tags'), 15, 2 );
        add_action( 'get_the_generator_xhtml', array($this,'generate_meta_tags'), 15, 2 );        
		add_action( 'wp_loaded',array($this,'process_donation'),20);  
		add_action( 'wc_qd_show_projects_list',array($this,'get_projects_list'));	
    
		add_action( 'woocommerce_checkout_update_order_meta',  array($this,'save_order_id_db'));
        add_action( 'woocommerce_add_order_item_meta',  array($this,'add_order_meta'),99,3);
        
		
		add_action( 'woocommerce_admin_order_data_after_billing_address', array($this,'custom_order_details_page_info'), 10, 1 ); 
        add_action( 'woocommerce_available_payment_gateways',array($this,'remove_gateway'));
        
        add_filter('woocommerce_hidden_order_itemmeta',array($this,'hide_core_fields'));
        add_filter( 'woocommerce_get_price', array($this,'get_price'),10,2);
		add_filter( 'woocommerce_get_settings_pages',  array($this,'settings_page') );
		add_filter( 'woocommerce_email_classes',  array($this,'email_classes'));
		add_filter('woocommerce_enable_order_notes_field',array($this,'order_notes'));
	}
 
	/**
	 * Hides Order Notes
	 * @return boolean [[Description]]
	 * @since 1.2
	 */
	public function order_notes(){ 
		if($this->donation_exsits() &&  $this->only_donation_exsits()){ 
			if(get_option('wc_quick_donation_hide_order_notes') === true){
				return false;
			}
		}
		return true;
	}
	
    /**
     * Adds Donation Meta Tag
     * @param   String $gen  Refer WP.ORG
     * @param   String $type Refer WP.ORG 
     * @returns String
     * @since 0.4
     */
    public function generate_meta_tags( $gen, $type ) {
        switch ( $type ) {
            case 'html':
                $gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation '.$this->plugin_v.'">';
                break;
            case 'xhtml':
                $gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation '.$this->plugin_v.'" />';
                break;
        }
        return $gen;
    }    
    
    /**
     * Hides Some Important Fields 
     * @since 1.0
     * @param   [[Type]] $fields [[Description]]
     * @returns [[Type]] [[Description]]
     */
    public function hide_core_fields($fields){
        $fields[] = '_is_donation';
        $fields[] = '_project_details';
        return $fields;
    }
                   
	/**
	 * Adds Settings Page
	 */
 	public function settings_page( $settings ) {
		$settings[] = include( wc_qd_p.'wc_qd_settings.php' );  
		return $settings;
	}
	 
	/**
	 * Adds Email Classes
	 */
	public function email_classes($email_classes){
		require_once( wc_qd_p.'wc_qd_email_processing.php' );
		require_once( wc_qd_p.'wc_qd_email_completed.php' );
		$email_classes['wc_quick_donation_processing_donation_email'] = new wc_quick_donation_processing_donation_email();
		$email_classes['wc_quick_donation_completed_donation_email'] = new wc_quick_donation_completed_donation_email();
		return $email_classes;		
	}	
	
	/**
	 * Adds Donation Order Meta. [Project Name]
	 * @param [[Type]] $order_id [[Description]]
	 * @since 0.2
     * @updated 1.0
	 */
	public function add_order_meta( $item_id, $values, $cart_item_key) { 
        if($this->donation_id == $values['product_id']){
            global $woocommerce;
            wc_add_order_item_meta( $item_id, "_project_details",$woocommerce->session->projects);	
            wc_add_order_item_meta( $item_id, "_is_donation",'yes');
        }
	} 
    
    /**
     * Saves Donation Order ID and adds order notes...
     * @param [[Type]] $order_id [[Description]]
     * @since 1.0
     * @adopedFrom add_order_meta
     */
    public function save_order_id_db($order_id){
        $order = new WC_Order($order_id);
        $items = $order->get_items();
        foreach($items as $item){
            $order_product_id = floatval($item['product_id']);
            if($this->donation_id == $order_product_id){
                $this->update_order_id($order_id);
                $format = sprintf(get_option('wc_quick_donation_order_notes_title'), $woocommerce->session->projects);
                $order->add_order_note($format);
                update_post_meta($order_id,'_is_donation',true);
            }
        }
        unset($order);
        return $order_id;
    }
 

    /**
     * Updates Order ID to [wc_quick_donation_ids] when donation is ordered
     * @param [int] $order_id [Donation Order ID]
     * @since 1.0
     */
    private function update_order_id($order_id){
        $ordersID = get_option('wc_quick_donation_ids');
        $save_order_id = array();
        if(empty($ordersID)){
            $save_order_id[] = $order_id;
        } else {
            $save_order_id = json_decode($ordersID,true);
            $save_order_id[] = $order_id;
        }
        update_option('wc_quick_donation_ids',json_encode($save_order_id));
        
    }
	
	/**
	 * Custom Title In Order View Page
	 * @since 1.0
	 */
	public function custom_order_details_page_info($order){
        $is_donation = wc_get_order_item_meta($order->id, '_is_donation');
        if($is_donation === true){
            echo '<p><strong>'.get_option('wc_quick_donation_project_section_title').' :</strong>'.wc_get_order_item_meta($order->id, '_project_details') . '</p>';
        }
        
		
	} 	
	
	
	 
    
	/**
	 * Get All Enabled And Avaiable Payment Gateway To List In Settings Page
	 * @returns array [Aviable Gateways]
	 */
	public function get_payments_gateway(){
		$payment = WC()->payment_gateways->payment_gateways();
		$gateways = array();
		foreach($payment as $gateway){
			if ( $gateway->enabled == 'yes' ){
				$gateways[$gateway->id] = $gateway->title;
			}
		}
		return $gateways;
	}
	
	
	/**
	 * Check's For Donation Product Exist In Cart
	 * @returns Boolean True|False
	 */
	public function donation_exsits(){
		global $woocommerce; 
		if(is_object($woocommerce->cart) && sizeof($woocommerce->cart->get_cart()) > 0){
			foreach($woocommerce->cart->get_cart() as $cart_item_key => $values){
				$_product = $values['data'];
				if($_product->id == $this->donation_id){
					return true;	
				}				
			}
		}
		return false;
	}	
	
	
	
	/**
	 * Check's For Donation Product Exist In Cart
	 * @returns Boolean True|False
	 */
	public function only_donation_exsits(){
		global $woocommerce;
        if( sizeof($woocommerce->cart->get_cart()) == 1 && $this->donation_exsits()){
			return true;	
		}
		return false;
	}		
	/**
	 * Gets Donation Current Price
	 * @param  $price 
	 * @param  $product 
	 * @returns 0 | price
	 */
	public function get_price($price, $product){
		global $woocommerce;
		if($product->id == $this->donation_id){ 
			return isset($woocommerce->session->jc_donation) ? floatval($woocommerce->session->jc_donation) : 0; 
		}
		return $price;
	}	
 
	
	/**
	 * Process The Given Donation
	 */
	public function process_donation(){
		global $woocommerce;
		
		
		if(isset($_POST['donation_add'])){
			$error = 0;
			$found = false;
			$donation = isset($_POST['donation_ammount']) ? $_POST['donation_ammount'] : false;
			$projects = isset($_POST['projects']) && !empty($_POST['projects']) ? $_POST['projects'] : false;
			$_SESSION['wc_qd_projects'] = $projects;  
            $min = get_option('wc_quick_donation_min_required_donation');
            $max = get_option('wc_quick_donation_max_required_donation');


			if(isset($_POST['projects']) && $_POST['projects'] == '' ){
				wc_add_notice(get_option('wc_quick_donation_msg_project_invalid'), 'error' );
				$error += 1;
			}	
			
            if(! empty($donation)){
                $donate_price = floatval($donation); 
                if($donate_price != 0 || $donate_price != null){
                    if($donate_price < $min){
                        $message = str_replace(array('{donation_amount}','{min_amount}'),array($donation,$min),get_option('wc_quick_donation_msg_amount_min_required'));
                        wc_add_notice($message, 'error' );
                        $error += 1;
                    }
                    
                    if($donate_price > $max){
                         $message = str_replace(array('{donation_amount}','{max_amount}'),array($donation,$max),get_option('wc_quick_donation_msg_amount_max_allowed'));
                        wc_add_notice($message, 'error' );
                        $error += 1;
                    }
                    
                } else {
                    $message = str_replace('{donation_amount}',$donation,get_option('wc_quick_donation_msg_amount_invalid'));
                    wc_add_notice($message, 'error' );
                    $error += 1;
                }
                
            } else {
                wc_add_notice(get_option('wc_quick_donation_msg_amount_empty'), 'error' );
                $error += 1;
            } 
			if($error ==0 ) {
                if($donation >= 0){
                    $woocommerce->session->jc_donation = $donation;
                    $woocommerce->session->projects = $projects; 
                    if( sizeof($woocommerce->cart->get_cart()) > 0){
                        foreach($woocommerce->cart->get_cart() as $cart_item_key=>$values){
                            $_product = $values['data'];
                            if($_product->id == $this->donation_id)
                                $found = true;
                        }

                        if(! $found){ 
							$this->add_donation_cart();
						 	
						} else {
							wc_add_notice(get_option('wc_quick_donation_msg_donation_exist'), 'error' );
						}
							
                            
                    }else{
                        $this->add_donation_cart();
                    }
                }			
            }
		}
		
 
	}	
	
	/**
	 * Adds Donation Product To Cart
	 */
	private function add_donation_cart(){
		global $woocommerce; 
		$this->remove_cart_items();
		$woocommerce->cart->add_to_cart($this->donation_id);
        $this->redirectCART();
		
	}

	/**
	 * Redirect To Checkout Page After Donation is Added
	 */
	public function redirectCART(){
		global $woocommerce; 
        $redirect_op = get_option('wc_quick_donation_redirect');
        if($redirect_op == 'cart'){
            wp_safe_redirect(WC()->cart->get_cart_url() );exit; 
        } else if($redirect_op == 'checkout'){
            wp_safe_redirect(WC()->cart->get_checkout_url() );exit; 
        }
		 
	}
	
	
	/**
	 * Allowes only selected payment gateway for donation product.
	 * @since 0.2
	 * @access public
	 */
	public function remove_gateway($gateway){ 
		if($this->donation_exsits() &&  $this->only_donation_exsits()){
			$payments = get_option('wc_quick_donation_payment_gateway'); 
			
			if(!empty($payments)){
				foreach($gateway as $val){
					if(! in_array($val->id,$payments)){
						unset($gateway[$val->id]);
					}  
				}
			}
			return $gateway;	
		} 
		return $gateway;	
	}
	
	/**
	 * Removes Cart ITEM if donation is added
	 * @returns Boolean [[Description]]
	 */
	private function remove_cart_items(){
		$cart_remove = get_option('wc_quick_donation_cart_remove');
		if(isset($cart_remove) && $cart_remove == 'true'){
			global $woocommerce;
			$woocommerce->cart->empty_cart();
			return true;
		}
		return true;
	}


	/**
	 * Gets Donation Form.
	 * @updated 1.2
	 */
	public function wc_qd_form(){
		global $woocommerce; 
        
		$donate = isset($woocommerce->session->jc_donation) ? floatval($woocommerce->session->jc_donation) : 0;
		if(!$this->donation_exsits()){  
			unset($woocommerce->session->jc_donation); 
			unset($woocommerce->session->projects); 
		}
		
		// $donate = jc_round_donation($woocommerce->cart->total ); 
		$show_form_donatio_exist = get_option('wc_quick_donation_hide_form');
		if($this->donation_exsits() && $show_form_donatio_exist){
			$this->_load_donation_form();
		}else if(! $this->donation_exsits()){
			$this->_load_donation_form();
			
		}
		
		 
	}	
	 
 	/**
 	 * Requires Donation Form
 	 * Actions 1 wc_quick_donation_before_form
 	 * Actions 2 wc_quick_donation_after_form
 	 * @since 1.2
 	 */
 	private function _load_donation_form(){
		do_action('wc_quick_donation_before_form');
		$wc_get_template = function_exists('wc_get_template') ? 'wc_get_template' : 'woocommerce_get_template';
		$wc_get_template( 'donation_form.php', array(), '', wc_qd_p . 'template/' ); 
		do_action('wc_quick_donation_after_form');
	}
	
	public function donation_projects(){
		$projects_db = get_option('wc_quick_donation_projects');
		if(!empty($projects_db) && $projects_db != null){
			$project = explode(',',$projects_db);
			return $project;
		}
		return false;
	}
	
	
	/**
	 * Generates Select Box For Projects List
	 * @updated 1.2
	 */
	public function get_projects_list(){
			$projects_db = $this->donation_projects();
			if($projects_db){
				$project_list = '';
				$project_list .= '<option value="" > Select A Project </option>';
				foreach($projects_db as $proj){
					$project_list .= '<option value="'.$proj.'" > '.$proj.'</option>';
				}
				echo '<select name="projects">'.$project_list.'</select>';
			}
	}
	
	
	/**
	 * wc_quick_donation shortcode Handler
	 */
	public function shortcode_handler(){
		return $this->wc_qd_form();
	}
	
	
	/**
	 * Install The Plugin
	 */
	public static function install() {
		$exist = get_option('wc_quick_donation_product_id');

		if($exist){
            if ( get_post_status ( $exist ) ) {
                return true;
            } else {
                $post_id = create_donation();
                add_option('wc_quick_donation_product_id',$post_id); 
                add_site_option( 'wc_quick_donation_product_id', $post_id) ;
            }
			
		} else { 
            $post_id = create_donation();
			add_option('wc_quick_donation_product_id',$post_id); 
            add_option('wc_quick_donation_ids','');
		    add_site_option( 'wc_quick_donation_product_id', $post_id) ;
		}
	}
	
	/**
	* Protects Donation Product By 
	* @filter_user post_row_actions
	* @param  Array $actions Refer WP.org
	* @param  Array $post    Refer WP.org
	* @return Array Refer WP.org
	* @since 1.0
	*/
	public function protect_donation_product($actions,$post) {
		if('product' == $post->post_type) {  
			if($post->ID == $this->donation_id){
				unset($actions['inline hide-if-no-js']);
				unset($actions['trash']);
				unset($actions['duplicate']);
				$actions['trash'] = '<a href="javascript:alert(\'Remove Woocommerce Quick Donation Plugin To Remove This Product \');"> Trash </a>';
				
			}
		}
        return $actions;
	}
     
}


function create_donation(){
    $userID = 1;
    if(get_current_user_id()){
        $userID = get_current_user_id();
    }
    $post = array(
        'post_author' => $userID,
        'post_content' => 'Used For Donation',
        'post_status' => 'publish',
        'post_title' => 'Donation',
        'post_type' => 'product',
    );

    $post_id = wp_insert_post($post);  
    update_post_meta($post_id, '_stock_status', 'instock');
    update_post_meta($post_id, '_tax_status', 'none');
    update_post_meta($post_id, '_tax_class',  'zero-rate');
    update_post_meta($post_id, '_visibility', 'hidden');
    update_post_meta($post_id, '_stock', '');
    update_post_meta($post_id, '_virtual', 'yes');
    update_post_meta($post_id, '_featured', 'no');
    update_post_meta($post_id, '_manage_stock', "no" );
    update_post_meta($post_id, '_sold_individually', "yes" );
    update_post_meta($post_id, '_sku', 'checkout-donation');   			
    return $post_id;
}

/**
 * Check if WooCommerce is active 
 * if yes then call the class
 */
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
	register_activation_hook( __FILE__, array( 'wc_quick_donation', 'install' ) );
	$wc_quick_donation = new wc_quick_donation;
    require(wc_qd_p.'wc_qd_donation_orders.php');
    require(wc_qd_p.'wc_qd_widget.php');
    
    function register_foo_widget() {
        register_widget( 'woocommerce_quick_donation_widget' );
    }
    add_action( 'widgets_init', 'register_foo_widget' );
    
} else {
	add_action( 'admin_notices', 'wc_quick_donation_notice' );
}

function wc_quick_donation_notice() {
	echo '<div class="error"><p><strong> <i> Woocommerce Quick Donation </i> </strong> Requires <a href="'.admin_url( 'plugin-install.php?tab=plugin-information&plugin=woocommerce').'"> <strong> <u>Woocommerce</u></strong>  </a> To Be Installed And Activated </p></div>';
}
?>