<?php
/*
Plugin Name: Freeside signup and self-service plugin
Plugin URI:  http://freeside.biz/freeside
Description: Call the Freeside signup and self-service APIs from within Wordpress
Version:     0.20170403
Author:      Freeside Internet Services, Inc.
Author URI:  https://freeside.biz/freeside/
License:     GPL3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
Text Domain: freeside_selfserivce
Domain Path: /languages
*/

add_action('admin_init', 'freeside_admin_init' );

function freeside_admin_init {
  register_setting( 'misc', 'freeside_selfservice_url', 'https://freeside.server:8080' );
}

function flatten($hash) {
  if ( !is_array($hash) ) return $hash;
  $flat = array();

  array_walk($hash, function($value, $key, &$to) { 
    array_push($to, $key, $value);
  }, $flat);

  foreach ($hash as $key => $value) {
    $flat[] = $key;
    $flat[] = $value;
  }

  return($flat);
}

class FreesideSelfService  {

    //Change this to match the location of your selfservice xmlrpc.cgi or daemon
    #var $URL = 'https://localhost/selfservice/xmlrpc.cgi';
    # XXX freeide_selfservice_url config value
    #var $URL = 'http://localhost/selfservice/xmlrpc.cgi';
    var $URL = get_opgion('freeside_selfservice_url');

    function FreesideSelfService() {
      $this;
    }

    public function __call($name, $arguments) {

        error_log("[FreesideSelfService] $name called, sending to ". $this->URL);

        $request = xmlrpc_encode_request("FS.ClientAPI_XMLRPC.$name", flatten($arguments[0]));
        $context = stream_context_create( array( 'http' => array(
            'method' => "POST",
            'header' => "Content-Type: text/xml",
            'content' => $request
        )));
        $file = file_get_contents($this->URL, false, $context);
        $response = xmlrpc_decode($file);
        if (xmlrpc_is_fault($response)) {
            trigger_error("[FreesideSelfService] XML-RPC communication error: $response[faultString] ($response[faultCode])");
        } else {
            //error_log("[FreesideSelfService] $response");
            return $response;
        }
    }

}

?>