<?php
/**
 * AllOfLabelRequestImageInfo
 *
 * PHP version 5
 *
 * @category Class
 * @package  USPS\Labels
 * @author   Swagger Codegen team
 * @link     https://github.com/swagger-api/swagger-codegen
 */

/**
 * Labels
 *
 * Contact Us: [USPS API Support](https://emailus.usps.com/s/usps-APIs) | [Terms of Service](https://about.usps.com/termsofuse.htm)  The USPS&#174; Labels API allows you to digitally create mailing labels for the following mail classes: USPS Ground Advantage&#8482;, Parcel Select&#174; Destination Entry, Parcel Select Lightweight&#174;, USPS Connect&#174; Local, USPS Connect&#174; Regional, Priority  Mail&#174;, Priority Mail Express&#174;, Bound Printed Matter, Library Mail, and Media Mail&#174;.  * Use the [Getting Started guide](https://developers.usps.com/getting-started) to get started with the Labels API. * The USPS&#174; Labels API uses a token to authorize the use of an [Enterprise Payment](https://postalpro.usps.com/EPS) or Permit account. The specification to generate the token is in the [Payments 3.0 - Set Payment Account Information](https://developers.usps.com/paymentsv3#tag/Resources/operation/post-payments-payment-authorization).  **Manifest Scheduling**   The following table outlines the Domestic Label manifesting schedule for specific conditions listed below.   | Condition                   | Scheduling | | ----------------------------| -------- | | **Customs Forms labels**    | 12:30am CT on the day after label creation. | | **Return labels**    | 12:30am CT on the day after label creation. | | **Smart Locker labels**     | Electronic data is sent to Postal systems within 15 minutes of label creation. | | **Value of `true` provided for `immediateManifest` field**| Electronic data is sent to Postal systems within 15 minutes of label creation.  | | **Label is added to a [SCAN Form](https://developers.usps.com/scanv3#tag/Resources/operation/post-scan-form)**| Electronic data is sent to Postal systems within 15 minutes of SCAN Form creation.  | | **All other conditions**    | 12:30am CT after the `mailingDate` value provided by the user |
 *
 * OpenAPI spec version: 3.9.9
 * 
 * Generated by: https://github.com/swagger-api/swagger-codegen.git
 * Swagger Codegen version: 3.0.71
 */
/**
 * NOTE: This class is auto generated by the swagger code generator program.
 * https://github.com/swagger-api/swagger-codegen
 * Do not edit the class manually.
 */

namespace USPS\Labels\Model;
use \USPS\Labels\ObjectSerializer;

/**
 * AllOfLabelRequestImageInfo Class Doc Comment
 *
 * @category Class
 * @description Image Information
 * @package  USPS\Labels
 * @author   Swagger Codegen team
 * @link     https://github.com/swagger-api/swagger-codegen
 */
class AllOfLabelRequestImageInfo extends ImageInfo 
{
    const DISCRIMINATOR = null;

    /**
      * The original name of the model.
      *
      * @var string
      */
    protected static $swaggerModelName = 'AllOfLabelRequestImageInfo';

    /**
      * Array of property to type mappings. Used for (de)serialization
      *
      * @var string[]
      */
    protected static $swaggerTypes = [
        'suppress_postage' => 'bool',
        'suppress_mail_date' => 'bool',
        'return_label' => 'bool',
        'package_number' => 'int',
        'total_packages' => 'int'
    ];

    /**
      * Array of property to format mappings. Used for (de)serialization
      *
      * @var string[]
      */
    protected static $swaggerFormats = [
        'suppress_postage' => null,
        'suppress_mail_date' => null,
        'return_label' => null,
        'package_number' => null,
        'total_packages' => null
    ];

    /**
     * Array of property to type mappings. Used for (de)serialization
     *
     * @return array
     */
    public static function swaggerTypes()
    {
        return self::$swaggerTypes + parent::swaggerTypes();
    }

    /**
     * Array of property to format mappings. Used for (de)serialization
     *
     * @return array
     */
    public static function swaggerFormats()
    {
        return self::$swaggerFormats + parent::swaggerFormats();
    }

    /**
     * Array of attributes where the key is the local name,
     * and the value is the original name
     *
     * @var string[]
     */
    protected static $attributeMap = [
        'suppress_postage' => 'suppressPostage',
        'suppress_mail_date' => 'suppressMailDate',
        'return_label' => 'returnLabel',
        'package_number' => 'packageNumber',
        'total_packages' => 'totalPackages'
    ];

    /**
     * Array of attributes to setter functions (for deserialization of responses)
     *
     * @var string[]
     */
    protected static $setters = [
        'suppress_postage' => 'setSuppressPostage',
        'suppress_mail_date' => 'setSuppressMailDate',
        'return_label' => 'setReturnLabel',
        'package_number' => 'setPackageNumber',
        'total_packages' => 'setTotalPackages'
    ];

    /**
     * Array of attributes to getter functions (for serialization of requests)
     *
     * @var string[]
     */
    protected static $getters = [
        'suppress_postage' => 'getSuppressPostage',
        'suppress_mail_date' => 'getSuppressMailDate',
        'return_label' => 'getReturnLabel',
        'package_number' => 'getPackageNumber',
        'total_packages' => 'getTotalPackages'
    ];

    /**
     * Array of attributes where the key is the local name,
     * and the value is the original name
     *
     * @return array
     */
    public static function attributeMap()
    {
        return parent::attributeMap() + self::$attributeMap;
    }

    /**
     * Array of attributes to setter functions (for deserialization of responses)
     *
     * @return array
     */
    public static function setters()
    {
        return parent::setters() + self::$setters;
    }

    /**
     * Array of attributes to getter functions (for serialization of requests)
     *
     * @return array
     */
    public static function getters()
    {
        return parent::getters() + self::$getters;
    }

    /**
     * The original name of the model.
     *
     * @return string
     */
    public function getModelName()
    {
        return self::$swaggerModelName;
    }




    /**
     * Constructor
     *
     * @param mixed[] $data Associated array of property values
     *                      initializing the model
     */
    public function __construct(array $data = null)
    {
        parent::__construct($data);

        $this->container['suppress_postage'] = isset($data['suppress_postage']) ? $data['suppress_postage'] : true;
        $this->container['suppress_mail_date'] = isset($data['suppress_mail_date']) ? $data['suppress_mail_date'] : true;
        $this->container['return_label'] = isset($data['return_label']) ? $data['return_label'] : false;
        $this->container['package_number'] = isset($data['package_number']) ? $data['package_number'] : null;
        $this->container['total_packages'] = isset($data['total_packages']) ? $data['total_packages'] : null;
    }

    /**
     * Show all the invalid properties with reasons.
     *
     * @return array invalid properties with reasons
     */
    public function listInvalidProperties()
    {
        $invalidProperties = parent::listInvalidProperties();

        return $invalidProperties;
    }

    /**
     * Validate all the properties in the model
     * return true if all passed
     *
     * @return bool True if all properties are valid
     */
    public function valid()
    {
        return count($this->listInvalidProperties()) === 0;
    }


    /**
     * Gets suppress_postage
     *
     * @return bool
     */
    public function getSuppressPostage()
    {
        return $this->container['suppress_postage'];
    }

    /**
     * Sets suppress_postage
     *
     * @param bool $suppress_postage Indicates if postage is printed on the label.  If omitted then the request will be defaulted to true.
     *
     * @return $this
     */
    public function setSuppressPostage($suppress_postage)
    {
        $this->container['suppress_postage'] = $suppress_postage;

        return $this;
    }

    /**
     * Gets suppress_mail_date
     *
     * @return bool
     */
    public function getSuppressMailDate()
    {
        return $this->container['suppress_mail_date'];
    }

    /**
     * Sets suppress_mail_date
     *
     * @param bool $suppress_mail_date Indicates if the `mailingDate` is printed on the label.  If omitted then the value will default to true.  Note:  * Mail Date cannot be suppressed on Domestic Customs Forms. The customs form will always display the Date of Mailing.  * The date the label was created cannot be suppressed and will always print on the label.
     *
     * @return $this
     */
    public function setSuppressMailDate($suppress_mail_date)
    {
        $this->container['suppress_mail_date'] = $suppress_mail_date;

        return $this;
    }

    /**
     * Gets return_label
     *
     * @return bool
     */
    public function getReturnLabel()
    {
        return $this->container['return_label'];
    }

    /**
     * Sets return_label
     *
     * @param bool $return_label Indicates if a pay on use returns label is requested along with the outbound label.  If omitted then the request will be defaulted to false.  The mail class of the generated return label will be based off of the mail class provided in `packageDescription.mailClass`. * Priority Mail Express Return Service label will be generated with `packageDescription.mailClass` of `PRIORITY_MAIL_EXPRESS`. * Priority Mail Return Service label will be generated with `packageDescription.mailClass` of `PRIORITY_MAIL`. * USPS Ground Advantage Return Service label will be generated with all other `packageDescription.mailClass` enumerations.  Note:  * An `imageType` value of `LABEL_BROKER` is currently not supported when `returnLabel` is set to true.  * A `packageDescription.mailClass` value of `USPS_CONNECT_MAIL` is currently not supported when `returnLabel` is set to true.  * `returnLabel` cannot be set to `true` when generating customs forms.  * `returnLabel` is not available when Extra Service Code `415 - USPS Label Delivery` is used.
     *
     * @return $this
     */
    public function setReturnLabel($return_label)
    {
        $this->container['return_label'] = $return_label;

        return $this;
    }

    /**
     * Gets package_number
     *
     * @return int
     */
    public function getPackageNumber()
    {
        return $this->container['package_number'];
    }

    /**
     * Sets package_number
     *
     * @param int $package_number The package number in a series such as 1 of 3, 2 of 3, etc.  If `totalPackages` is populated then `packageNumber` is required.  `packageNumber` must be less than or equal to `totalPackages`.  This feature is not supported on the 2x7 or 4x4 label format.  Note: * When `packageNumber` is provided with a Destination Entry Facility, the Drop-Off Location will not be displayed on the label.
     *
     * @return $this
     */
    public function setPackageNumber($package_number)
    {
        $this->container['package_number'] = $package_number;

        return $this;
    }

    /**
     * Gets total_packages
     *
     * @return int
     */
    public function getTotalPackages()
    {
        return $this->container['total_packages'];
    }

    /**
     * Sets total_packages
     *
     * @param int $total_packages The total number of packages in a series such as 999.  If packageNumber is populated then totalPackages is required.  totalPackages must be greater than or equal to packageNumber.  This feature is not supported by the 2x7 or 4x4 label format.
     *
     * @return $this
     */
    public function setTotalPackages($total_packages)
    {
        $this->container['total_packages'] = $total_packages;

        return $this;
    }
    /**
     * Returns true if offset exists. False otherwise.
     *
     * @param integer $offset Offset
     *
     * @return boolean
     */
    #[\ReturnTypeWillChange]
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
     * Gets offset.
     *
     * @param integer $offset Offset
     *
     * @return mixed
     */
    #[\ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    /**
     * Sets value based on offset.
     *
     * @param integer $offset Offset
     * @param mixed   $value  Value to be set
     *
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    /**
     * Unsets offset.
     *
     * @param integer $offset Offset
     *
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
     * Gets the string presentation of the object
     *
     * @return string
     */
    public function __toString()
    {
        if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print
            return json_encode(
                ObjectSerializer::sanitizeForSerialization($this),
                JSON_PRETTY_PRINT
            );
        }

        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
    }
}
