<?php

namespace Xentral\Modules\Dhl\Request;

/**
 * Class CreateShipmentRequest
 *
 * @package Xentral\Modules\Dhl\Request
 */
class CreateNationalShipmentRequest
{
    /** @var string */
    protected $product;
    /** @var string */
    protected $shipmentDate;
    /** @var float */
    protected $weight;
    /** @var float */
    protected $length;
    /** @var float */
    protected $width;
    /** @var float */
    protected $height;
    /** @var string */
    protected $name1;
    /** @var string */
    protected $name2;
    /** @var string */
    protected $name3;
    /** @var string */
    protected $street;
    /** @var string */
    protected $streetNo;
    /** @var string */
    protected $zip;
    /** @var string */
    protected $city;
    /** @var string */
    protected $country;
    /** @var string */
    protected $email;
    /** @var boolean */
    protected $printOnlyIfCodeable;

    /**
     * CreateShipmentRequest constructor.
     *
     * @param string  $shipmentDate
     * @param float   $weight
     * @param float   $length
     * @param float   $width
     * @param float   $height
     * @param string  $name1
     * @param string  $name2
     * @param string  $name3
     * @param string  $street
     * @param string  $streetNo
     * @param string  $zip
     * @param string  $city
     * @param string  $country
     * @param string  $email
     * @param boolean $printOnlyIfCodeable
     */
    public function __construct(
        $shipmentDate,
        $weight,
        $length,
        $width,
        $height,
        $name1,
        $name2,
        $name3,
        $street,
        $streetNo,
        $zip,
        $city,
        $country,
        $email,
        $printOnlyIfCodeable
    ) {
        $this->product = 'V01PAK';
        $this->shipmentDate = $shipmentDate;
        $this->weight = $weight;
        $this->length = $length;
        $this->width = $width;
        $this->height = $height;
        $this->name1 = $name1;
        $this->name2 = $name2;
        $this->name3 = $name3;
        $this->street = $street;
        $this->streetNo = $streetNo;
        $this->zip = $zip;
        $this->city = $city;
        $this->country = $country;
        $this->email = $email;
        $this->printOnlyIfCodeable = $printOnlyIfCodeable;
    }

    /**
     * @param string $username
     * @param string $password
     * @param string $accountNumber
     * @param string $senderName
     * @param string $senderStreetName
     * @param string $senderStreetNo
     * @param string $senderZip
     * @param string $senderCity
     * @param string $senderCountry
     * @param string $senderEmail
     *
     * @return string
     */
    public function toXml($username, $password, $accountNumber, $senderName, $senderStreetName, $senderStreetNo, $senderZip, $senderCity, $senderCountry, $senderEmail)
    {
        $printOnlyIfCodeableActive = $this->printOnlyIfCodeable ? '1' : '0';
        $payload = <<<XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cis="http://dhl.de/webservice/cisbase" xmlns:ns="http://dhl.de/webservices/businesscustomershipping/3.0">
   <soapenv:Header>
      <cis:Authentification>
         <cis:user>{$username}</cis:user>
         <cis:signature>{$password}</cis:signature>
      </cis:Authentification>
   </soapenv:Header>
   <soapenv:Body>
      <ns:CreateShipmentOrderRequest>
         <ns:Version>
            <majorRelease>3</majorRelease>
            <minorRelease>0</minorRelease>
            <build>1</build>
         </ns:Version>
         <ShipmentOrder>
            <sequenceNumber>?</sequenceNumber>
            <Shipment>
               <ShipmentDetails>
                  <product>{$this->product}</product>
                  <cis:accountNumber>{$accountNumber}</cis:accountNumber>
                  <customerReference/>
                  <shipmentDate>{$this->shipmentDate}</shipmentDate>
                  <costCentre/>
                  <ShipmentItem>
                     <weightInKG>{$this->weight}</weightInKG>
                     <lengthInCM>{$this->length}</lengthInCM>
                     <widthInCM>{$this->width}</widthInCM>
                     <heightInCM>{$this->height}</heightInCM>
                  </ShipmentItem>
                  <Service>
                  </Service>
                  <Notification>
                     <recipientEmailAddress/>
                  </Notification>
                  </ShipmentDetails>
               <Shipper>
                  <Name>
                     <cis:name1>{$senderName}</cis:name1>
                  </Name>
                  <Address>
                     <cis:streetName>{$senderStreetName}</cis:streetName>
                     <cis:streetNumber>{$senderStreetNo}</cis:streetNumber>
                     <cis:addressAddition/>
                     <cis:dispatchingInformation/>
                     <cis:zip>{$senderZip}</cis:zip>
                     <cis:city>{$senderCity}</cis:city>
                     <cis:province/>
                     <cis:Origin>
                        <cis:countryISOCode>{$senderCountry}</cis:countryISOCode>
                        <cis:state/>
                     </cis:Origin>
                  </Address>
                  <Communication>
                     <cis:phone/>
                     <cis:email>{$senderEmail}</cis:email>
                     <cis:contactPerson/>
                  </Communication>
               </Shipper>
               
               <Receiver>
                  <cis:name1>{$this->name1}</cis:name1>
                  <Address>
                     <cis:name2>{$this->name2}</cis:name2>
                     <cis:name3>{$this->name3}</cis:name3>
                     <cis:streetName>{$this->street}</cis:streetName>
                     <cis:streetNumber>{$this->streetNo}</cis:streetNumber>
                     <cis:addressAddition/>
                     <cis:dispatchingInformation/>
                     <cis:zip>{$this->zip}</cis:zip>
                     <cis:city>{$this->city}</cis:city>
                     <cis:province/>
                     <cis:Origin>
                        <cis:countryISOCode>{$this->country}</cis:countryISOCode>
                        <cis:state/>
                     </cis:Origin>
                  </Address>
                  <Communication>
                     <cis:phone/>
                     <cis:email>{$this->email}</cis:email>
                     <cis:contactPerson/>
                  </Communication>
               </Receiver>
               </Shipment>
            <PrintOnlyIfCodeable active="{$printOnlyIfCodeableActive}"/>
         </ShipmentOrder>
         <labelResponseType>B64</labelResponseType>
      </ns:CreateShipmentOrderRequest>
   </soapenv:Body>
</soapenv:Envelope>
XML;

        return $payload;
    }
}