<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: proto/gtfs.proto

namespace Gtfs;

use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;

/**
 * Generated from protobuf message <code>gtfs.Calendar</code>
 */
class Calendar extends \Google\Protobuf\Internal\Message
{
    /**
     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
     *
     * Generated from protobuf field <code>string service_id = 1;</code>
     */
    protected $service_id = '';
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
     */
    protected $monday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
     */
    protected $tuesday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
     */
    protected $wednesday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
     */
    protected $thursday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
     */
    protected $friday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
     */
    protected $saturday = 0;
    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
     */
    protected $sunday = 0;
    /**
     * Generated from protobuf field <code>string start_date = 9;</code>
     */
    protected $start_date = '';
    /**
     * Generated from protobuf field <code>string end_date = 10;</code>
     */
    protected $end_date = '';
    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     */
    protected $extension = null;

    /**
     * Constructor.
     *
     * @param array $data {
     *     Optional. Data for populating the Message object.
     *
     *     @type string $service_id
     *           The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
     *     @type int $monday
     *     @type int $tuesday
     *     @type int $wednesday
     *     @type int $thursday
     *     @type int $friday
     *     @type int $saturday
     *     @type int $sunday
     *     @type string $start_date
     *     @type string $end_date
     *     @type \Google\Protobuf\Any $extension
     *           The extensions namespace allows 3rd-party developers to extend the
     *           GTFS specification in order to add and evaluate new features and
     *           modifications to the spec.
     * }
     */
    public function __construct($data = NULL) {
        \GPBMetadata\Proto\Gtfs::initOnce();
        parent::__construct($data);
    }

    /**
     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
     *
     * Generated from protobuf field <code>string service_id = 1;</code>
     * @return string
     */
    public function getServiceId()
    {
        return $this->service_id;
    }

    /**
     * The trip_id field contains an ID that identifies a trip. The trip_id is dataset unique.
     *
     * Generated from protobuf field <code>string service_id = 1;</code>
     * @param string $var
     * @return $this
     */
    public function setServiceId($var)
    {
        GPBUtil::checkString($var, True);
        $this->service_id = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
     * @return int
     */
    public function getMonday()
    {
        return $this->monday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay monday = 2;</code>
     * @param int $var
     * @return $this
     */
    public function setMonday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->monday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
     * @return int
     */
    public function getTuesday()
    {
        return $this->tuesday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay tuesday = 3;</code>
     * @param int $var
     * @return $this
     */
    public function setTuesday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->tuesday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
     * @return int
     */
    public function getWednesday()
    {
        return $this->wednesday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay wednesday = 4;</code>
     * @param int $var
     * @return $this
     */
    public function setWednesday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->wednesday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
     * @return int
     */
    public function getThursday()
    {
        return $this->thursday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay thursday = 5;</code>
     * @param int $var
     * @return $this
     */
    public function setThursday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->thursday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
     * @return int
     */
    public function getFriday()
    {
        return $this->friday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay friday = 6;</code>
     * @param int $var
     * @return $this
     */
    public function setFriday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->friday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
     * @return int
     */
    public function getSaturday()
    {
        return $this->saturday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay saturday = 7;</code>
     * @param int $var
     * @return $this
     */
    public function setSaturday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->saturday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
     * @return int
     */
    public function getSunday()
    {
        return $this->sunday;
    }

    /**
     * Generated from protobuf field <code>.gtfs.Calendar.CalendarDay sunday = 8;</code>
     * @param int $var
     * @return $this
     */
    public function setSunday($var)
    {
        GPBUtil::checkEnum($var, \Gtfs\Calendar_CalendarDay::class);
        $this->sunday = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>string start_date = 9;</code>
     * @return string
     */
    public function getStartDate()
    {
        return $this->start_date;
    }

    /**
     * Generated from protobuf field <code>string start_date = 9;</code>
     * @param string $var
     * @return $this
     */
    public function setStartDate($var)
    {
        GPBUtil::checkString($var, True);
        $this->start_date = $var;

        return $this;
    }

    /**
     * Generated from protobuf field <code>string end_date = 10;</code>
     * @return string
     */
    public function getEndDate()
    {
        return $this->end_date;
    }

    /**
     * Generated from protobuf field <code>string end_date = 10;</code>
     * @param string $var
     * @return $this
     */
    public function setEndDate($var)
    {
        GPBUtil::checkString($var, True);
        $this->end_date = $var;

        return $this;
    }

    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     * @return \Google\Protobuf\Any
     */
    public function getExtension()
    {
        return $this->extension;
    }

    /**
     * The extensions namespace allows 3rd-party developers to extend the
     * GTFS specification in order to add and evaluate new features and
     * modifications to the spec.
     *
     * Generated from protobuf field <code>.google.protobuf.Any extension = 2000;</code>
     * @param \Google\Protobuf\Any $var
     * @return $this
     */
    public function setExtension($var)
    {
        GPBUtil::checkMessage($var, \Google\Protobuf\Any::class);
        $this->extension = $var;

        return $this;
    }

}

