<?php


namespace iDServer\Saml;


use InvalidArgumentException;

class AuthnRequestData extends AbstractSamlData
{
    /**
     * @var string
     */
    private $assertionConsumerServiceURL;

    /**
     * @var string
     */
    private $protocolBinding;

    /**
     * @var NameIdPolicy
     */
    private $nameIdPolicy;

    /**
     * @var string[]
     */
    private $audiences;

    /**
     * @var ExtensionData
     */
    private $extensions;

    /**
     * @return string
     */
    public function getAssertionConsumerServiceURL(): ?string
    {
        return $this->assertionConsumerServiceURL;
    }

    /**
     * @param string $assertionConsumerServiceURL
     * @return $this
     */
    public function setAssertionConsumerServiceURL(string $assertionConsumerServiceURL): AuthnRequestData
    {
        if (!filter_var($assertionConsumerServiceURL, FILTER_VALIDATE_URL)) {
            throw new InvalidArgumentException("Invalid URL: " . $assertionConsumerServiceURL);
        }
        $this->assertionConsumerServiceURL = $assertionConsumerServiceURL;
        return $this;
    }

    /**
     * Alias of {@link setAssertionConsumerServiceURL()}
     *
     * @param string $landingPage
     * @return $this
     */
    public function setResponseLandingPage(string $landingPage): AuthnRequestData
    {
        $this->setAssertionConsumerServiceURL($landingPage);
        return $this;
    }

    /**
     * @return string
     */
    public function getProtocolBinding(): ?string
    {
        return $this->protocolBinding;
    }

    /**
     * @param string $protocolBinding
     * @return $this
     */
    public function setProtocolBinding(string $protocolBinding): AuthnRequestData
    {
        $this->protocolBinding = $protocolBinding;
        return $this;
    }

    /**
     * @return NameIdPolicy
     */
    public function getNameIdPolicy(): ?NameIdPolicy
    {
        return $this->nameIdPolicy;
    }

    /**
     * @param NameIdPolicy $nameIdPolicy
     * @return $this
     */
    public function setNameIdPolicy(NameIdPolicy $nameIdPolicy): AuthnRequestData
    {
        $this->nameIdPolicy = $nameIdPolicy;
        return $this;
    }

    /**
     * @return string[]
     */
    public function getAudiences(): array
    {
        return $this->audiences;
    }

    /**
     * @param string[] $audiences
     * @return $this
     */
    public function setAudiences(array $audiences): AuthnRequestData
    {
        $this->audiences = $audiences;
        return $this;
    }

    /**
     * @return ExtensionData
     */
    public function getExtensions(): ?ExtensionData
    {
        return $this->extensions;
    }

    /**
     * @param ExtensionData $extensions
     * @return $this
     */
    public function setExtensions(ExtensionData $extensions): AuthnRequestData
    {
        $this->extensions = $extensions;
        return $this;
    }

    /**
     * @param AttributeData[] $attributes
     * @return $this
     */
    public function setExtensionAttributes(array $attributes): AuthnRequestData
    {
        if (!$this->getExtensions()) {
            $this->setExtensions(new ExtensionData());
        }
        $this->getExtensions()->setAttributes($attributes);
        
        return $this;
    }

    /**
     * @param AttributeData $attributeData
     * @return $this
     */
    public function addExtensionAttribute(AttributeData $attributeData): AuthnRequestData
    {
        if (!$this->getExtensions()) {
            $this->setExtensions(new ExtensionData());
        }
        $this->getExtensions()->addAttribute($attributeData);
        
        return $this;
    }

    /**
     * @param array $attributes
     * @return $this
     */
    public function setExtensionRequestedAttributes(array $attributes): AuthnRequestData
    {
        if (!$this->getExtensions()) {
            $this->setExtensions(new ExtensionData());
        }
        $this->getExtensions()->setRequestedAttributes($attributes);
        
        return $this;
    }

    /**
     * @param AttributeData $attributeData
     * @return $this
     */
    public function addExtensionRequestedAttribute(AttributeData $attributeData): AuthnRequestData
    {
        if (!$this->getExtensions()) {
            $this->setExtensions(new ExtensionData());
        }
        $this->getExtensions()->addRequestedAttribute($attributeData);

        return $this;
    }
    
    /**
     * @param string $spType
     * @return $this
     */
    public function setSpType(string $spType)
    {
        if (!$this->getExtensions()) {
            $this->setExtensions(new ExtensionData());
        }
        $this->getExtensions()->setSpType($spType);
        
        return $this;
    }
}
