<?php

/**
 * Handles logic for setting and retrieving commercial lead extra prices
 *
 * Class Wiaas_Package_CL_Pricing
 */
class Wiaas_Package_CL_Pricing {

    /**
     * Sets package extra prices
     *
     * @param int $owner_id ID of the shop owner organization who set extra prices
     * @param int $package_id
     * @param  array $cl_extras
     */
    public static function set_extras($owner_id, $package_id, $cl_extras) {

        foreach ($cl_extras as $extra_type => $cl_extra) {
            unset($cl_extra['type']);
            unset($cl_extra['customer']);

            $cl_extras[$extra_type] = $cl_extra;
        }

	    $old_extras = self::get_extras($owner_id, $package_id);

        // Persist package price extras
        update_term_meta(
	        $owner_id,
            '_wiaas_cm_extras_'.$package_id,
            $cl_extras);

	    do_action('wiaas_package_prices_extras_set', $owner_id, $package_id, $cl_extras, $old_extras);
    }

    /**
     * Retrieves package catalogue extra prices
     *
     * @param int $owner_id ID of the shop owner organization who set extra prices
     * @param int $package_id
     *
     * @return array|null
     */
    public static function get_extras($owner_id, $package_id) {
        $cl_extras = get_term_meta(
	        $owner_id,
            '_wiaas_cm_extras_'.$package_id,
            true);

        return is_array($cl_extras) ? $cl_extras : null;
    }

    /**
     * Retrieve catalogue package extra prices for provided customer
     *
     * If customer specific prices are set for the package, only those will be retrieved
     * otherwise deafult prices exras will be retrieved
     *
     * @param int $owner_id ID of the shop owner organization who set extra prices
     * @param string $pay_type Payment type for the pacakge
     * @param int $package_id ID of the package
     * @param int $customer_id ID of the customer
     *
     * @return array|null
     */
    public static function get_extras_for_customer($owner_id, $pay_type, $package_id, $customer_id) {
        $cl_extras = self::get_extras($owner_id, $package_id);

        if (! empty($cl_extras)) {
            // if customer specific prices are set for this package use only them
	        // else use default prices set for this package
            if (self::_customer_specific_prices_exist($cl_extras, $customer_id)) {
	            $cl_pay_type = $pay_type . '_customer_' . $customer_id;
            } else {
            	$cl_pay_type = $pay_type . '_default';
            }

	        $cl_pay_type_extras =  $cl_extras[$cl_pay_type];

            // if commercial lead has default price for this package then use it
            if (! empty($cl_pay_type_extras) && $cl_pay_type_extras['visible']) {

                return array(
                    'fixed' => floatval($cl_pay_type_extras['fixed']),
                    'services' => floatval($cl_pay_type_extras['services']),
                    'recurrent' => floatval($cl_pay_type_extras['recurrent'])
                );
            }
        }

        // there are no prices set for this payment type
        return null;
    }


    private static function _customer_specific_prices_exist($cl_extras, $customer_id) {

    	$pay_types = array_keys(Wiaas_Package_Pricing::get_available_pay_types());

	    $cl_customer_pay_types = array();
	    foreach ($pay_types as $pay_type) {
	    	$cl_customer_pay_types[] =  $pay_type.'_customer_'.$customer_id;
	    }

    	foreach ($cl_extras as $cl_pay_type => $data) {
    		if (in_array($cl_pay_type, $cl_customer_pay_types)) {
    			return true;
		    }
	    }

	    return false;
    }
}
