<?php

namespace iDServer\Message;


use DOMDocument;
use DOMXPath;
use iDServer\AbstractKeyStore;
use iDServer\Constants;
use iDServer\Log;
use iDServer\Message\Strategy\AbstractMessageHandlingStrategy;
use iDServer\Saml\LogoutRequestData;
use iDServer\Saml\Status;


class Logout extends AbstractMessage
{
    /**
     * @param AbstractKeyStore $keyStore
     * @param string $server
     * @param LogoutRequestData $data
     */
    public function __construct(AbstractKeyStore $keyStore, $server, LogoutRequestData $data)
    {
        parent::__construct($keyStore, $data);
        if (!$this->getData()->getDestination()) {
            $this->getData()->setDestination($server . '/saml/logout');
        }
    }

    /**
     * @return string
     */
    public function getType()
    {
        return MessageType::LOGOUT;
    }

    /**
     * Get the DOMDocument instance of the unsigned LogoutRequest XML
     *
     * @param AbstractMessageHandlingStrategy $strategy
     * @return DOMDocument
     */
    protected function getUnsignedXml(AbstractMessageHandlingStrategy $strategy)
    {
        /* @var $data LogoutRequestData */
        $data = $this->getData();
        $doc = $strategy->createLogoutRequest($data);

        Log::debug("Constructed unsigned logout xml:\n" . $doc->saveXML());
        return $doc;
    }

    /**
     * @param DOMDocument $doc
     * @return array
     *
     *      <ul>
     *          <li>Success: boolean
     *          <li>MessageId: string, ID from the XML
     *          <li>MessageType: string, {@link MessageType::LogoutReply}
     *          <li>XML: DOMDocument
     *      </ul>
     */
    public static function receiveMessage($doc)
    {
        $xpath = new DOMXPath($doc);
        $xpath->registerNamespace('saml2p', Constants\NS_SAMLP);
        $xpath->registerNamespace('saml2', Constants\NS_SAML);

        $statuscode = $xpath
            ->query("saml2p:Status/saml2p:StatusCode[@Value]/@Value", $doc->documentElement)->item(0)
            ->nodeValue;

        $result = [
            'Success' => ($statuscode === Status::SUCCESS),
            'MessageId' => $doc->documentElement->getAttribute('ID'),
            'MessageType' => MessageType::LOGOUT_REPLY,
            'XML' => $doc
        ];

        Log::debug("Logout result: " . print_r($result, true));

        return $result;
    }
}
