<?php

/**
 * W3 CDN Netdna Class
 */
if (!defined('ABSPATH')) {
    die();
}

define('W3TC_CDN_MIRROR_COTENDO_WSDL', 'https://api.cotendo.net/cws?wsdl');
define('W3TC_CDN_MIRROR_COTENDO_ENDPOINT', 'http://api.cotendo.net/cws?ver=1.0');
define('W3TC_CDN_MIRROR_COTENDO_NAMESPACE', 'http://api.cotendo.net/');

w3_require_once(W3TC_LIB_W3_DIR . '/Cdn/Mirror.php');

/**
 * Class W3_Cdn_Mirror_Cotendo
 */
class W3_Cdn_Mirror_Cotendo extends W3_Cdn_Mirror {
    /**
     * PHP5 Constructor
     *
     * @param array $config
     */
    function __construct($config = array()) {
        $config = array_merge(array(
            'username' => '',
            'password' => '',
            'zones' => array(),
        ), $config);

        parent::__construct($config);
    }

    /**
     * Purges remote files
     *
     * @param array $files
     * @param array $results
     * @return boolean
     */
    function purge($files, &$results) {
        if (empty($this->_config['username'])) {
            $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, 'Empty username.');

            return false;
        }

        if (empty($this->_config['password'])) {
            $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, 'Empty password.');

            return false;
        }

        if (empty($this->_config['zones'])) {
            $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, 'Empty zones list.');

            return false;
        }

        w3_require_once(W3TC_LIB_NUSOAP_DIR . '/nusoap.php');

        $client = new nusoap_client(
            W3TC_CDN_MIRROR_COTENDO_WSDL,
            'wsdl'
        );

        $error = $client->getError();

        if ($error) {
            $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, sprintf('Constructor error (%s).', $error));

            return false;
        }

        $client->authtype = 'basic';
        $client->username = $this->_config['username'];
        $client->password = $this->_config['password'];
        $client->forceEndpoint = W3TC_CDN_MIRROR_COTENDO_ENDPOINT;

        foreach ((array) $this->_config['zones'] as $zone) {
            $expressions = array();

            foreach ($files as $file) {
                $remote_path = $file['remote_path'];
                $expressions[] = '/' . $remote_path;
            }

            $expression = implode("\n", $expressions);

            $params = array(
                'cname' => $zone,
                'flushExpression' => $expression,
                'flushType' => 'hard',
            );

            $client->call('doFlush', $params, W3TC_CDN_MIRROR_COTENDO_NAMESPACE);

            if ($client->fault) {
                $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, 'Invalid response.');

                return false;
            }

            $error = $client->getError();

            if ($error) {
                $results = $this->_get_results($files, W3TC_CDN_RESULT_HALT, sprintf('Unable to purge (%s).', $error));

                return false;
            }
        }

        $results = $this->_get_results($files, W3TC_CDN_RESULT_OK, 'OK');

        return true;
    }

    /**
     * Purges CDN completely
     * @param $results
     * @return bool
     */
    function purge_all(&$results) {
        return $this->purge(array(array('local_path'=>'*', 'remote_path'=> '*')), $results);
    }

    /**
     * If CDN supports path of type folder/*
     * @return bool
     */
    function supports_folder_asterisk() {
        return true;
    }
}
