<?php

namespace OfficeBrain\Bundle\CouponBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @author OfficeBrain 4835 <info@officebrain.com>
 * Entity For Coupon
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 */

/**
 * Coupon.
 *
 * @ORM\Table(name="tbl_coupon_master")
 * @ORM\Entity(repositoryClass="OfficeBrain\Bundle\CouponBundle\Entity\CouponRepository")
 * @UniqueEntity(fields={"couponCode"}, message="admin.duplicate")
 */
class Coupon
{
    /**
     * @var int
     *
     * @ORM\Column(type="bigint", name="id", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(name="coupon_code", type="string",length=12, unique=true)
     */
    private $couponCode;

    /**
     * @var int
     * @Assert\NotBlank(message = "admin.not_blank")
     * @ORM\Column(type="bigint", name="country_id",nullable=true)

     */
    private $countryId;

    /**
     * @var string
     * @Assert\NotBlank(message = "admin.not_blank")
     * @ORM\Column(name="coupon_type", type="string", length=50,nullable=true)
     */
    private $couponType;

    /**
     * @var bool
     *
     * @ORM\Column(name="is_autogenerate", type="boolean",nullable=true)
     */
    private $isAutogenerate;

    /**
     * @var float
     * @Assert\NotBlank(message = "admin.not_blank")
     * @Assert\Regex("/^[0-9]*(\.[0-9]+)?$/",message="please enter valid amount")
     * @ORM\Column(name="coupon_amount", type="float")
     */
    private $couponAmount;

    /**
     * @var bool
     *
     * @ORM\Column(name="is_free_shipping", type="boolean",nullable=true)
     */
    private $isFreeShipping;

    /**
     * @var bool
     *
     * @ORM\Column(name="is_before_tax", type="boolean",nullable=true)
     */
    private $isBeforeTax;

    /**
     * @var bool
     *
     * @ORM\Column(name="is_sale_item", type="boolean",nullable=true)
     */
    private $isSaleItem;

    /**
     * @var string
     *
     * @ORM\Column(name="is_csv", type="string",length=5,nullable=true)
     */
    private $isCsv;

    /**
     * @var string
     * @Assert\Regex("/^[0-9+].*$/",message="admin.valid_amount")
     * @ORM\Column(name="usage_limit", type="integer", length=11,nullable=true)
     */
    private $usageLimit;

    /**
     * @var int
     *
     * @ORM\Column(name="usage_count", type="integer" , length=11,nullable=true)
     */
    private $usageCount;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="start_date", type="date",nullable=true)
     */
    private $startDate;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="end_date", type="date",nullable=true)
     */
    private $endDate;

    /**
     * @var string
     * @Assert\Regex(
     *     pattern="/^([-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?|,|\;)+$/",
     *     match=true,
     *     message="Your name cannot contain a number"
     * )
     * @ORM\Column(name="user_email", type="string", length=50,nullable=true)
     */
    private $userEmail;

    /**
     * @var string
     *
     * @ORM\Column(name="user_groups", type="string", length=255,nullable=true)
     */
    private $userGroups;

    /**
     * @var string
     *
     * @ORM\Column(name="status", type="string", length=50,nullable=true)
     */
    private $status;

    /**
     * @var string
     *
     * @ORM\Column(name="coupon_prifix", type="string", length=3 ,nullable=true)
     */
    private $couponPrifix;

    /**
     * @var \integer
     *
     * @ORM\Column(name="instance_id", type="integer",length=11,nullable=true)
     */
    private $instanceId;

    /**
     * @var \string
     *
     * @ORM\Column(name="instance_type", type="string",length=255,nullable=true)
     */
    private $instanceType;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created_at", type="datetime",nullable=true)
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated_at", type="datetime",nullable=true)
     */
    private $updatedAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="deleted_at", type="datetime",nullable=true)
     */
    private $deletedAt;

    /**
     * @var \integer
     *
     * @ORM\Column(name="created_uid", type="integer",length=11,nullable=true)
     */
    private $createdUid;

    /**
     * @var \integer
     *
     * @ORM\Column(name="deleted_uid", type="integer",length=11,nullable=true)
     */
    private $deletedUid;

    /**
     * @var \integer
     *
     * @ORM\Column(name="updated_uid", type="integer",length=11,nullable=true)
     */
    private $updatedUid;

    /**
     * @ORM\OneToMany(targetEntity="\OfficeBrain\Bundle\CouponBundle\Entity\CouponLanguage", mappedBy="couponId", cascade={"all"})
     */
    protected $languageMapping;

    public function __construct()
    {
        $this->languageMapping = new ArrayCollection();
    }

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set id.
     *
     * @param int $Id
     *
     * @return coupon
     */
    public function setId($Id)
    {
        $this->id = $Id;

        return $this;
    }

    /**
     * Set countryId.
     *
     * @param int $countryId
     *
     * @return Couponcountry
     */
    public function setCountryId($countryId)
    {
        $this->countryId = $countryId;

        return $this;
    }

    /**
     * Get countryId.
     *
     * @return int
     */
    public function getCountryId()
    {
        return $this->countryId;
    }

    /**
     * Set couponCode.
     *
     * @param string $couponCode
     *
     * @return Coupon
     */
    public function setCouponCode($couponCode)
    {
        $this->couponCode = $couponCode;

        return $this;
    }

    /**
     * Get couponCode.
     *
     * @return string
     */
    public function getCouponCode()
    {
        return $this->couponCode;
    }

    /**
     * Set couponType.
     *
     * @param string $couponType
     *
     * @return Coupon
     */
    public function setCouponType($couponType)
    {
        $this->couponType = $couponType;

        return $this;
    }

    /**
     * Get couponType.
     *
     * @return string
     */
    public function getCouponType()
    {
        return $this->couponType;
    }

    /**
     * Set isAutogenerate.
     *
     * @param bool $isAutogenerate
     *
     * @return Coupon
     */
    public function setIsAutogenerate($isAutogenerate)
    {
        $this->isAutogenerate = $isAutogenerate;

        return $this;
    }

    /**
     * Get $isAutogenerate.
     *
     * @return bool
     */
    public function getIsAutogenerate()
    {
        return $this->isAutogenerate;
    }

    /**
     * Set couponAmount.
     *
     * @param float $couponAmount
     *
     * @return Coupon
     */
    public function setCouponAmount($couponAmount)
    {
        $this->couponAmount = $couponAmount;

        return $this;
    }

    /**
     * Get couponAmount.
     *
     * @return float
     */
    public function getCouponAmount()
    {
        return $this->couponAmount;
    }

    /**
     * Set isFreeShipping.
     *
     * @param bool $isFreeShipping
     *
     * @return Coupon
     */
    public function setIsFreeShipping($isFreeShipping)
    {
        $this->isFreeShipping = $isFreeShipping;

        return $this;
    }

    /**
     * Get isFreeShipping.
     *
     * @return bool
     */
    public function getIsFreeShipping()
    {
        return $this->isFreeShipping;
    }

    /**
     * Set isBeforeTax.
     *
     * @param bool $isBeforeTax
     *
     * @return Coupon
     */
    public function setIsBeforeTax($isBeforeTax)
    {
        $this->isBeforeTax = $isBeforeTax;

        return $this;
    }

    /**
     * Get isBeforeTax.
     *
     * @return bool
     */
    public function getIsBeforeTax()
    {
        return $this->isBeforeTax;
    }

    /**
     * Set isSaleItem.
     *
     * @param bool $isSaleItem
     *
     * @return Coupon
     */
    public function setIsSaleItem($isSaleItem)
    {
        $this->isSaleItem = $isSaleItem;

        return $this;
    }

    /**
     * Get isSaleItem.
     *
     * @return bool
     */
    public function getIsSaleItem()
    {
        return $this->isSaleItem;
    }

    /**
     * Get isCsv.
     *
     * @return string
     */
    public function getIsCsv()
    {
        return $this->isCsv;
    }

    /**
     * Set isCsv.
     *
     * @param string $isCsv
     *
     * @return Coupon
     */
    public function setIsCsv($isCsv)
    {
        $this->isCsv = $isCsv;

        return $this;
    }

    /**
     * Set usageLimit.
     *
     * @param int $usageLimit
     *
     * @return Coupon
     */
    public function setUsageLimit($usageLimit)
    {
        $this->usageLimit = $usageLimit;

        return $this;
    }

    /**
     * Get usageLimit.
     *
     * @return int
     */
    public function getUsageLimit()
    {
        return $this->usageLimit;
    }

    /**
     * Set usageCount.
     *
     * @param int $usageCount
     *
     * @return Coupon
     */
    public function setUsageCount($usageCount)
    {
        $this->usageCount = $usageCount;

        return $this;
    }

    /**
     * Get usageCount.
     *
     * @return int
     */
    public function getUsageCount()
    {
        return $this->usageCount;
    }

    /**
     * Set startDate.
     *
     * @param \DateTime $startDate
     *
     * @return Coupon
     */
    public function setStartDate($startDate)
    {
        $this->startDate = $startDate;

        return $this;
    }

    /**
     * Get startDate.
     *
     * @return \DateTime
     */
    public function getStartDate()
    {
        return $this->startDate;
    }

    /**
     * Set endDate.
     *
     * @param \DateTime $endDate
     *
     * @return Coupon
     */
    public function setEndDate($endDate)
    {
        $this->endDate = $endDate;

        return $this;
    }

    /**
     * Get endDate.
     *
     * @return \DateTime
     */
    public function getEndDate()
    {
        return $this->endDate;
    }

    /**
     * Set userEmail.
     *
     * @param string $userEmail
     *
     * @return Coupon
     */
    public function setUserEmail($userEmail)
    {
        $this->userEmail = $userEmail;

        return $this;
    }

    /**
     * Get userEmail.
     *
     * @return string
     */
    public function getUserEmail()
    {
        return $this->userEmail;
    }

    /**
     * Set userGroups.
     *
     * @param string $userGroups
     *
     * @return Coupon
     */
    public function setUserGroups($userGroups)
    {
        $this->userGroups = $userGroups;

        return $this;
    }

    /**
     * Get userGroups.
     *
     * @return string
     */
    public function getUserGroups()
    {
        return $this->userGroups;
    }

    /**
     * Set status.
     *
     * @param string $status
     *
     * @return Coupon
     */
    public function setStatus($status)
    {
        $this->status = $status;

        return $this;
    }

    /**
     * Get status.
     *
     * @return string
     */
    public function getStatus()
    {
        return $this->status;
    }

    /**
     * Set couponPrifix.
     *
     * @param string $couponPrifix
     *
     * @return Coupon
     */
    public function setCouponPrifix($couponPrifix)
    {
        $this->couponPrifix = $couponPrifix;

        return $this;
    }

    /**
     * Get couponPrifix.
     *
     * @return string
     */
    public function getCouponPrifix()
    {
        return $this->couponPrifix;
    }

    /**
     * Set instanceId.
     *
     * @param int $instanceId
     *
     * @return Coupon
     */
    public function setInstanceId($instanceId)
    {
        $this->instanceId = $instanceId;

        return $this;
    }

    /**
     * Get instanceId.
     *
     * @return int
     */
    public function getInstanceId()
    {
        return $this->instanceId;
    }

    /**
     * Set instanceType.
     *
     * @param string $instanceType
     *
     * @return Coupon
     */
    public function setInstanceType($instanceType)
    {
        $this->instanceType = $instanceType;

        return $this;
    }

    /**
     * Get instanceType.
     *
     * @return string
     */
    public function getInstanceType()
    {
        return $this->instanceType;
    }

    /**
     * Set createdAt.
     *
     * @param \DateTime $createdAt
     *
     * @return Coupon
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt.
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set updatedAt.
     *
     * @param \DateTime $updatedAt
     *
     * @return Coupon
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt.
     *
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set deletedAt.
     *
     * @param \DateTime $deletedAt
     *
     * @return Coupon
     */
    public function setDeletedAt($deletedAt)
    {
        $this->deletedAt = $deletedAt;

        return $this;
    }

    /**
     * Get deletedAt.
     *
     * @return \DateTime
     */
    public function getDeletedAt()
    {
        return $this->deletedAt;
    }

    /**
     * Set createdUid.
     *
     * @param int $createdUid
     *
     * @return Coupon
     */
    public function setCreatedUid($createdUid)
    {
        $this->createdUid = $createdUid;

        return $this;
    }

    /**
     * Get createdUid.
     *
     * @return int
     */
    public function getCreatedUid()
    {
        return $this->createdUid;
    }

    /**
     * Set deletedUid.
     *
     * @param int $deletedUid
     *
     * @return Coupon
     */
    public function setDeletedUid($deletedUid)
    {
        $this->deletedUid = $deletedUid;

        return $this;
    }

    /**
     * Get deletedUid.
     *
     * @return int
     */
    public function getDeletedUid()
    {
        return $this->deletedUid;
    }

    /**
     * Set updatedUid.
     *
     * @param int $updatedUid
     *
     * @return Coupon
     */
    public function setUpdatedUid($updatedUid)
    {
        $this->updatedUid = $updatedUid;

        return $this;
    }

    /**
     * Get updatedUid.
     *
     * @return int
     */
    public function getUpdatedUid()
    {
        return $this->updatedUid;
    }

    /**
     * Add languageMapping.
     *
     * @param \OfficeBrain\Bundle\CouponBundle\Entity\CouponLanguage $languageMapping
     *
     * @return Coupon
     */
    public function addLanguageMapping(\OfficeBrain\Bundle\CouponBundle\Entity\CouponLanguage $languageMapping)
    {
        $this->languageMapping[] = $languageMapping;

        return $this;
    }

    /**
     * Remove languageMapping.
     *
     * @param \OfficeBrain\Bundle\CouponBundle\Entity\CouponLanguage $languageMapping
     */
    public function removeLanguageMapping(\OfficeBrain\Bundle\CouponBundle\Entity\CouponLanguage $languageMapping)
    {
        $this->languageMapping->removeElement($languageMapping);
    }

    /**
     * Get languageMapping.
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getLanguageMapping()
    {
        return $this->languageMapping;
    }
}
