<?php

namespace StructType;

use \WsdlToPhp\PackageBase\AbstractStructBase;

/**
 * This class stands for JP_SearchSegmentsHotels StructType
 * @subpackage Structs
 */
class JP_SearchSegmentsHotels extends AbstractStructBase
{
    /**
     * The SearchSegmentHotels
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \StructType\JP_SearchSegmentHotels
     */
    public $SearchSegmentHotels;
    /**
     * The Nights
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var int
     */
    public $Nights;
    /**
     * The Suppliers
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \StructType\JP_Suppliers
     */
    public $Suppliers;
    /**
     * The HotelCodes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfString9
     */
    public $HotelCodes;
    /**
     * The HotelName
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $HotelName;
    /**
     * The CountryOfResidence
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $CountryOfResidence;
    /**
     * The HotelCategories
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_HotelCategory
     */
    public $HotelCategories;
    /**
     * The HotelTypes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_HotelType
     */
    public $HotelTypes;
    /**
     * The PropertyTypes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_PropertyType
     */
    public $PropertyTypes;
    /**
     * The Boards
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_Board
     */
    public $Boards;
    /**
     * The SupplementTypes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_SupplementHotelType
     */
    public $SupplementTypes;
    /**
     * The InfoSource
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $InfoSource;
    /**
     * The ProductClass
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $ProductClass;
    /**
     * The PromoCodes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfString10
     */
    public $PromoCodes;
    /**
     * The PaymentType
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $PaymentType;
    /**
     * The PackageContracts
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var string
     */
    public $PackageContracts;
    /**
     * The DailyContracts
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_DailyHotelContract
     */
    public $DailyContracts;
    /**
     * The ContractCodes
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \ArrayType\ArrayOfJP_HotelContractCodes
     */
    public $ContractCodes;
    /**
     * The Discount
     * Meta information extracted from the WSDL
     * - maxOccurs: 1
     * - minOccurs: 0
     * @var \StructType\JP_RequestDiscount
     */
    public $Discount;
    /**
     * Constructor method for JP_SearchSegmentsHotels
     * @uses JP_SearchSegmentsHotels::setSearchSegmentHotels()
     * @uses JP_SearchSegmentsHotels::setNights()
     * @uses JP_SearchSegmentsHotels::setSuppliers()
     * @uses JP_SearchSegmentsHotels::setHotelCodes()
     * @uses JP_SearchSegmentsHotels::setHotelName()
     * @uses JP_SearchSegmentsHotels::setCountryOfResidence()
     * @uses JP_SearchSegmentsHotels::setHotelCategories()
     * @uses JP_SearchSegmentsHotels::setHotelTypes()
     * @uses JP_SearchSegmentsHotels::setPropertyTypes()
     * @uses JP_SearchSegmentsHotels::setBoards()
     * @uses JP_SearchSegmentsHotels::setSupplementTypes()
     * @uses JP_SearchSegmentsHotels::setInfoSource()
     * @uses JP_SearchSegmentsHotels::setProductClass()
     * @uses JP_SearchSegmentsHotels::setPromoCodes()
     * @uses JP_SearchSegmentsHotels::setPaymentType()
     * @uses JP_SearchSegmentsHotels::setPackageContracts()
     * @uses JP_SearchSegmentsHotels::setDailyContracts()
     * @uses JP_SearchSegmentsHotels::setContractCodes()
     * @uses JP_SearchSegmentsHotels::setDiscount()
     * @param \StructType\JP_SearchSegmentHotels $searchSegmentHotels
     * @param int $nights
     * @param \StructType\JP_Suppliers $suppliers
     * @param \ArrayType\ArrayOfString9 $hotelCodes
     * @param string $hotelName
     * @param string $countryOfResidence
     * @param \ArrayType\ArrayOfJP_HotelCategory $hotelCategories
     * @param \ArrayType\ArrayOfJP_HotelType $hotelTypes
     * @param \ArrayType\ArrayOfJP_PropertyType $propertyTypes
     * @param \ArrayType\ArrayOfJP_Board $boards
     * @param \ArrayType\ArrayOfJP_SupplementHotelType $supplementTypes
     * @param string $infoSource
     * @param string $productClass
     * @param \ArrayType\ArrayOfString10 $promoCodes
     * @param string $paymentType
     * @param string $packageContracts
     * @param \ArrayType\ArrayOfJP_DailyHotelContract $dailyContracts
     * @param \ArrayType\ArrayOfJP_HotelContractCodes $contractCodes
     * @param \StructType\JP_RequestDiscount $discount
     */
    public function __construct(\StructType\JP_SearchSegmentHotels $searchSegmentHotels = null, $nights = null, \StructType\JP_Suppliers $suppliers = null, \ArrayType\ArrayOfString9 $hotelCodes = null, $hotelName = null, $countryOfResidence = null, \ArrayType\ArrayOfJP_HotelCategory $hotelCategories = null, \ArrayType\ArrayOfJP_HotelType $hotelTypes = null, \ArrayType\ArrayOfJP_PropertyType $propertyTypes = null, \ArrayType\ArrayOfJP_Board $boards = null, \ArrayType\ArrayOfJP_SupplementHotelType $supplementTypes = null, $infoSource = null, $productClass = null, \ArrayType\ArrayOfString10 $promoCodes = null, $paymentType = null, $packageContracts = null, \ArrayType\ArrayOfJP_DailyHotelContract $dailyContracts = null, \ArrayType\ArrayOfJP_HotelContractCodes $contractCodes = null, \StructType\JP_RequestDiscount $discount = null)
    {
        $this
            ->setSearchSegmentHotels($searchSegmentHotels)
            ->setNights($nights)
            ->setSuppliers($suppliers)
            ->setHotelCodes($hotelCodes)
            ->setHotelName($hotelName)
            ->setCountryOfResidence($countryOfResidence)
            ->setHotelCategories($hotelCategories)
            ->setHotelTypes($hotelTypes)
            ->setPropertyTypes($propertyTypes)
            ->setBoards($boards)
            ->setSupplementTypes($supplementTypes)
            ->setInfoSource($infoSource)
            ->setProductClass($productClass)
            ->setPromoCodes($promoCodes)
            ->setPaymentType($paymentType)
            ->setPackageContracts($packageContracts)
            ->setDailyContracts($dailyContracts)
            ->setContractCodes($contractCodes)
            ->setDiscount($discount);
    }
    /**
     * Get SearchSegmentHotels value
     * @return \StructType\JP_SearchSegmentHotels|null
     */
    public function getSearchSegmentHotels()
    {
        return $this->SearchSegmentHotels;
    }
    /**
     * Set SearchSegmentHotels value
     * @param \StructType\JP_SearchSegmentHotels $searchSegmentHotels
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setSearchSegmentHotels(\StructType\JP_SearchSegmentHotels $searchSegmentHotels = null)
    {
        $this->SearchSegmentHotels = $searchSegmentHotels;
        return $this;
    }
    /**
     * Get Nights value
     * @return int|null
     */
    public function getNights()
    {
        return $this->Nights;
    }
    /**
     * Set Nights value
     * @param int $nights
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setNights($nights = null)
    {
        // validation for constraint: int
        if (!is_null($nights) && !(is_int($nights) || ctype_digit($nights))) {
            throw new \InvalidArgumentException(sprintf('Invalid value %s, please provide an integer value, %s given', var_export($nights, true), gettype($nights)), __LINE__);
        }
        $this->Nights = $nights;
        return $this;
    }
    /**
     * Get Suppliers value
     * @return \StructType\JP_Suppliers|null
     */
    public function getSuppliers()
    {
        return $this->Suppliers;
    }
    /**
     * Set Suppliers value
     * @param \StructType\JP_Suppliers $suppliers
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setSuppliers(\StructType\JP_Suppliers $suppliers = null)
    {
        $this->Suppliers = $suppliers;
        return $this;
    }
    /**
     * Get HotelCodes value
     * @return \ArrayType\ArrayOfString9|null
     */
    public function getHotelCodes()
    {
        return $this->HotelCodes;
    }
    /**
     * Set HotelCodes value
     * @param \ArrayType\ArrayOfString9 $hotelCodes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setHotelCodes(\ArrayType\ArrayOfString9 $hotelCodes = null)
    {
        $this->HotelCodes = $hotelCodes;
        return $this;
    }
    /**
     * Get HotelName value
     * @return string|null
     */
    public function getHotelName()
    {
        return $this->HotelName;
    }
    /**
     * Set HotelName value
     * @param string $hotelName
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setHotelName($hotelName = null)
    {
        // validation for constraint: string
        if (!is_null($hotelName) && !is_string($hotelName)) {
            throw new \InvalidArgumentException(sprintf('Invalid value %s, please provide a string, %s given', var_export($hotelName, true), gettype($hotelName)), __LINE__);
        }
        $this->HotelName = $hotelName;
        return $this;
    }
    /**
     * Get CountryOfResidence value
     * @return string|null
     */
    public function getCountryOfResidence()
    {
        return $this->CountryOfResidence;
    }
    /**
     * Set CountryOfResidence value
     * @param string $countryOfResidence
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setCountryOfResidence($countryOfResidence = null)
    {
        // validation for constraint: string
        if (!is_null($countryOfResidence) && !is_string($countryOfResidence)) {
            throw new \InvalidArgumentException(sprintf('Invalid value %s, please provide a string, %s given', var_export($countryOfResidence, true), gettype($countryOfResidence)), __LINE__);
        }
        $this->CountryOfResidence = $countryOfResidence;
        return $this;
    }
    /**
     * Get HotelCategories value
     * @return \ArrayType\ArrayOfJP_HotelCategory|null
     */
    public function getHotelCategories()
    {
        return $this->HotelCategories;
    }
    /**
     * Set HotelCategories value
     * @param \ArrayType\ArrayOfJP_HotelCategory $hotelCategories
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setHotelCategories(\ArrayType\ArrayOfJP_HotelCategory $hotelCategories = null)
    {
        $this->HotelCategories = $hotelCategories;
        return $this;
    }
    /**
     * Get HotelTypes value
     * @return \ArrayType\ArrayOfJP_HotelType|null
     */
    public function getHotelTypes()
    {
        return $this->HotelTypes;
    }
    /**
     * Set HotelTypes value
     * @param \ArrayType\ArrayOfJP_HotelType $hotelTypes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setHotelTypes(\ArrayType\ArrayOfJP_HotelType $hotelTypes = null)
    {
        $this->HotelTypes = $hotelTypes;
        return $this;
    }
    /**
     * Get PropertyTypes value
     * @return \ArrayType\ArrayOfJP_PropertyType|null
     */
    public function getPropertyTypes()
    {
        return $this->PropertyTypes;
    }
    /**
     * Set PropertyTypes value
     * @param \ArrayType\ArrayOfJP_PropertyType $propertyTypes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setPropertyTypes(\ArrayType\ArrayOfJP_PropertyType $propertyTypes = null)
    {
        $this->PropertyTypes = $propertyTypes;
        return $this;
    }
    /**
     * Get Boards value
     * @return \ArrayType\ArrayOfJP_Board|null
     */
    public function getBoards()
    {
        return $this->Boards;
    }
    /**
     * Set Boards value
     * @param \ArrayType\ArrayOfJP_Board $boards
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setBoards(\ArrayType\ArrayOfJP_Board $boards = null)
    {
        $this->Boards = $boards;
        return $this;
    }
    /**
     * Get SupplementTypes value
     * @return \ArrayType\ArrayOfJP_SupplementHotelType|null
     */
    public function getSupplementTypes()
    {
        return $this->SupplementTypes;
    }
    /**
     * Set SupplementTypes value
     * @param \ArrayType\ArrayOfJP_SupplementHotelType $supplementTypes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setSupplementTypes(\ArrayType\ArrayOfJP_SupplementHotelType $supplementTypes = null)
    {
        $this->SupplementTypes = $supplementTypes;
        return $this;
    }
    /**
     * Get InfoSource value
     * @return string|null
     */
    public function getInfoSource()
    {
        return $this->InfoSource;
    }
    /**
     * Set InfoSource value
     * @param string $infoSource
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setInfoSource($infoSource = null)
    {
        // validation for constraint: string
        if (!is_null($infoSource) && !is_string($infoSource)) {
            throw new \InvalidArgumentException(sprintf('Invalid value %s, please provide a string, %s given', var_export($infoSource, true), gettype($infoSource)), __LINE__);
        }
        $this->InfoSource = $infoSource;
        return $this;
    }
    /**
     * Get ProductClass value
     * @return string|null
     */
    public function getProductClass()
    {
        return $this->ProductClass;
    }
    /**
     * Set ProductClass value
     * @param string $productClass
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setProductClass($productClass = null)
    {
        // validation for constraint: string
        if (!is_null($productClass) && !is_string($productClass)) {
            throw new \InvalidArgumentException(sprintf('Invalid value %s, please provide a string, %s given', var_export($productClass, true), gettype($productClass)), __LINE__);
        }
        $this->ProductClass = $productClass;
        return $this;
    }
    /**
     * Get PromoCodes value
     * @return \ArrayType\ArrayOfString10|null
     */
    public function getPromoCodes()
    {
        return $this->PromoCodes;
    }
    /**
     * Set PromoCodes value
     * @param \ArrayType\ArrayOfString10 $promoCodes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setPromoCodes(\ArrayType\ArrayOfString10 $promoCodes = null)
    {
        $this->PromoCodes = $promoCodes;
        return $this;
    }
    /**
     * Get PaymentType value
     * @return string|null
     */
    public function getPaymentType()
    {
        return $this->PaymentType;
    }
    /**
     * Set PaymentType value
     * @uses \EnumType\PaymentType::valueIsValid()
     * @uses \EnumType\PaymentType::getValidValues()
     * @throws \InvalidArgumentException
     * @param string $paymentType
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setPaymentType($paymentType = null)
    {
        // validation for constraint: enumeration
        if (!\EnumType\PaymentType::valueIsValid($paymentType)) {
            throw new \InvalidArgumentException(sprintf('Invalid value(s) %s, please use one of: %s from enumeration class \EnumType\PaymentType', is_array($paymentType) ? implode(', ', $paymentType) : var_export($paymentType, true), implode(', ', \EnumType\PaymentType::getValidValues())), __LINE__);
        }
        $this->PaymentType = $paymentType;
        return $this;
    }
    /**
     * Get PackageContracts value
     * @return string|null
     */
    public function getPackageContracts()
    {
        return $this->PackageContracts;
    }
    /**
     * Set PackageContracts value
     * @uses \EnumType\JP_PackageContracts::valueIsValid()
     * @uses \EnumType\JP_PackageContracts::getValidValues()
     * @throws \InvalidArgumentException
     * @param string $packageContracts
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setPackageContracts($packageContracts = null)
    {
        // validation for constraint: enumeration
        if (!\EnumType\JP_PackageContracts::valueIsValid($packageContracts)) {
            throw new \InvalidArgumentException(sprintf('Invalid value(s) %s, please use one of: %s from enumeration class \EnumType\JP_PackageContracts', is_array($packageContracts) ? implode(', ', $packageContracts) : var_export($packageContracts, true), implode(', ', \EnumType\JP_PackageContracts::getValidValues())), __LINE__);
        }
        $this->PackageContracts = $packageContracts;
        return $this;
    }
    /**
     * Get DailyContracts value
     * @return \ArrayType\ArrayOfJP_DailyHotelContract|null
     */
    public function getDailyContracts()
    {
        return $this->DailyContracts;
    }
    /**
     * Set DailyContracts value
     * @param \ArrayType\ArrayOfJP_DailyHotelContract $dailyContracts
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setDailyContracts(\ArrayType\ArrayOfJP_DailyHotelContract $dailyContracts = null)
    {
        $this->DailyContracts = $dailyContracts;
        return $this;
    }
    /**
     * Get ContractCodes value
     * @return \ArrayType\ArrayOfJP_HotelContractCodes|null
     */
    public function getContractCodes()
    {
        return $this->ContractCodes;
    }
    /**
     * Set ContractCodes value
     * @param \ArrayType\ArrayOfJP_HotelContractCodes $contractCodes
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setContractCodes(\ArrayType\ArrayOfJP_HotelContractCodes $contractCodes = null)
    {
        $this->ContractCodes = $contractCodes;
        return $this;
    }
    /**
     * Get Discount value
     * @return \StructType\JP_RequestDiscount|null
     */
    public function getDiscount()
    {
        return $this->Discount;
    }
    /**
     * Set Discount value
     * @param \StructType\JP_RequestDiscount $discount
     * @return \StructType\JP_SearchSegmentsHotels
     */
    public function setDiscount(\StructType\JP_RequestDiscount $discount = null)
    {
        $this->Discount = $discount;
        return $this;
    }
}
