<?php
namespace App\Entity\System;
use Cms\TenantBundle\Entity\TenantedEntity;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Reinder83\BinaryFlags\Bits;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* Class SocialAccount
* @package App\Entity\System
*
* @ORM\Entity(
* repositoryClass = "App\Doctrine\Repository\System\SocialAccountRepository",
* )
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(
* name = "_discr",
* type = "string",
* )
* @ORM\DiscriminatorMap(self::DISCRS)
* @ORM\Table(
* name = "sys__social_account",
* uniqueConstraints = {
* @ORM\UniqueConstraint(
* name = "uidx__unique__facebook",
* columns = {
* "tenant",
* "facebookPageId",
* },
* ),
* @ORM\UniqueConstraint(
* name = "uidx__unique__twitter",
* columns = {
* "tenant",
* "twitterUserId",
* },
* ),
* },
* )
*/
abstract class SocialAccount extends TenantedEntity
{
const DISCRS = [
SocialAccounts\FacebookSocialAccount::DISCR => SocialAccounts\FacebookSocialAccount::class,
SocialAccounts\TwitterSocialAccount::DISCR => SocialAccounts\TwitterSocialAccount::class,
SocialAccounts\InstagramSocialAccount::DISCR => SocialAccounts\InstagramSocialAccount::class,
];
const DISCR = null;
const STATUSES__UNKNOWN = 0;
const STATUSES__OK = Bits::BIT_1;
const STATUSES__ERROR = ~Bits::BIT_1;
const USES = [
'notifications' => self::USES__NOTIFICATIONS,
'social_media_manager' => self::USES__SOCIAL_MEDIA_MANAGER,
];
const USES__NONE = 0;
const USES__NOTIFICATIONS = Bits::BIT_1;
const USES__SOCIAL_MEDIA_MANAGER = Bits::BIT_2;
/**
* @var string|null
*
* @ORM\Column(
* type = "string",
* nullable = false,
* )
*
* @Groups({"message_details", "template_details"})
*/
protected ?string $name = null;
protected ?DateTime $checkedOn = null;
protected ?DateTime $refreshedOn = null;
protected int $status = self::STATUSES__UNKNOWN;
/**
* @var int
*
* @ORM\Column(
* type = "bigint",
* nullable = false,
* options = {
* "default" = self::USES__NONE,
* "unsigned" = true,
* },
* )
*/
protected int $uses = self::USES__NONE;
/**
* @return string
*/
public function discr(): string
{
return static::DISCR;
}
/**
* @return string|null
*
* @Groups({"message_details", "template_details"})
*/
public function getDiscr(): ?string
{
return $this->discr();
}
/**
* @return string|null
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param string $name
* @return $this
*/
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
/**
* @return int
*/
public function getUses(): int
{
return $this->uses;
}
/**
* @return array|int[]
*/
public function getUsesAsBitmasks(): array
{
$result = [];
if ($this->uses != 0) {
foreach (self::USES as $bitmask) {
if ($this->hasUses($bitmask)) {
$result[] = $bitmask;
}
}
}
return $result;
}
/**
* @return array|string[]
*/
public function getUsesAsNames(): array
{
$result = [];
if ($this->uses != 0) {
foreach (self::USES as $name => $bitmask) {
if ($this->hasUses($bitmask)) {
$result[] = $name;
}
}
}
return $result;
}
/**
* @return array
*/
public function getUsesAsToggles(): array
{
$result = [];
foreach (self::USES as $name => $bitmask) {
$result[$name] = $this->hasUses($bitmask);
}
return $result;
}
/**
* @param int $uses
* @return $this
*/
public function setUses(int $uses): self
{
$this->uses = $uses;
return $this;
}
/**
* @param int $uses
* @return bool
*/
public function hasUses(int $uses): bool
{
return (($this->uses & $uses) == $uses);
}
/**
* @param int $uses
* @return bool
*/
public function anyUses(int $uses): bool
{
return (($this->uses & $uses) != 0);
}
/**
* @param int $uses
* @return $this
*/
public function flagUses(int $uses): self
{
$this->uses |= $uses;
return $this;
}
/**
* @param int $uses
* @return $this
*/
public function unflagUses(int $uses): self
{
$this->uses &= ~$uses;
return $this;
}
/**
* @param int $uses
* @param bool $flag
* @return $this
*/
public function toggleUses(int $uses, bool $flag): self
{
return ($flag) ? $this->flagUses($uses) : $this->unflagUses($uses);
}
/**
* @return string
*/
abstract public function __toString();
/**
* @return string|null
*/
abstract public function getIdentifier(): ?string;
}