<?php
namespace App\Entity;
use App\Repository\SeasonRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups; // Add this use statement
#[ORM\Entity(repositoryClass: SeasonRepository::class)]
class Season
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
#[Groups(["chat:channel:list", "chat_message"])] // Add group
private ?int $id = null;
#[ORM\Column(length: 255)]
#[Groups(["chat:channel:list", "chat_message"])] // Add group
private ?string $name = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $startDate = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $endDate = null;
#[ORM\Column]
private ?bool $isActive = null;
#[ORM\ManyToOne(inversedBy: 'seasons')]
#[ORM\JoinColumn(nullable: false)]
private ?Company $company = null;
#[ORM\OneToMany(mappedBy: 'season', targetEntity: TeamSeason::class, orphanRemoval: true)]
private Collection $teamSeasons;
#[ORM\OneToMany(mappedBy: 'season', targetEntity: Submission::class)]
private Collection $submissions;
#[ORM\OneToMany(mappedBy: 'season', targetEntity: ActivityConfiguration::class, orphanRemoval: true)]
private Collection $activityConfigurations;
#[ORM\Column(length: 50)]
private ?string $defaultValidationMethod = 'automatic';
#[ORM\Column(type: Types::JSON, nullable: true)]
private ?array $activityConfig = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $summary = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $imageFilename = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $rewards = null;
#[ORM\OneToOne(mappedBy: 'season', cascade: ['persist', 'remove'])]
private ?SeasonGoogleChatConfig $googleChatConfig = null;
#[ORM\Column(type: Types::BOOLEAN, options: ['default' => false])]
private bool $useBalancedScoring = false;
public function __toString(): string
{
return $this->getName();
}
public function __construct()
{
$this->teamSeasons = new ArrayCollection();
$this->submissions = new ArrayCollection();
$this->activityConfigurations = new ArrayCollection();
$this->isActive = false;
$this->useBalancedScoring = false;
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
public function getStartDate(): ?\DateTimeInterface
{
return $this->startDate;
}
public function setStartDate(\DateTimeInterface $startDate): static
{
$this->startDate = $startDate;
return $this;
}
public function getEndDate(): ?\DateTimeInterface
{
return $this->endDate;
}
public function setEndDate(\DateTimeInterface $endDate): static
{
$this->endDate = $endDate;
return $this;
}
public function isIsActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(bool $isActive): static
{
$this->isActive = $isActive;
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): static
{
$this->company = $company;
return $this;
}
/**
* @return Collection<int, TeamSeason>
*/
public function getTeamSeasons(): Collection
{
return $this->teamSeasons;
}
public function addTeamSeason(TeamSeason $teamSeason): static
{
if (!$this->teamSeasons->contains($teamSeason)) {
$this->teamSeasons->add($teamSeason);
$teamSeason->setSeason($this);
}
return $this;
}
public function removeTeamSeason(TeamSeason $teamSeason): static
{
if ($this->teamSeasons->removeElement($teamSeason)) {
// set the owning side to null (unless already changed)
if ($teamSeason->getSeason() === $this) {
$teamSeason->setSeason(null);
}
}
return $this;
}
/**
* @return Collection<int, Submission>
*/
public function getSubmissions(): Collection
{
return $this->submissions;
}
public function addSubmission(Submission $submission): static
{
if (!$this->submissions->contains($submission)) {
$this->submissions->add($submission);
$submission->setSeason($this);
}
return $this;
}
public function removeSubmission(Submission $submission): static
{
if ($this->submissions->removeElement($submission)) {
// set the owning side to null (unless already changed)
if ($submission->getSeason() === $this) {
$submission->setSeason(null);
}
}
return $this;
}
/**
* Get all teams participating in this season
*
* @return Collection<int, Team>
*/
public function getTeams(): Collection
{
$teams = new ArrayCollection();
foreach ($this->teamSeasons as $teamSeason) {
$teams->add($teamSeason->getTeam());
}
return $teams;
}
/**
* Check if the season is currently active based on dates
*/
public function isActive(): bool
{
$now = new \DateTime();
return $this->isActive &&
$this->startDate <= $now &&
$this->endDate >= $now;
}
/**
* @return Collection<int, ActivityConfiguration>
*/
public function getActivityConfigurations(): Collection
{
return $this->activityConfigurations;
}
public function addActivityConfiguration(ActivityConfiguration $activityConfiguration): static
{
if (!$this->activityConfigurations->contains($activityConfiguration)) {
$this->activityConfigurations->add($activityConfiguration);
$activityConfiguration->setSeason($this);
}
return $this;
}
public function removeActivityConfiguration(ActivityConfiguration $activityConfiguration): static
{
if ($this->activityConfigurations->removeElement($activityConfiguration)) {
// set the owning side to null (unless already changed)
if ($activityConfiguration->getSeason() === $this) {
$activityConfiguration->setSeason(null);
}
}
return $this;
}
public function getDefaultValidationMethod(): ?string
{
return $this->defaultValidationMethod;
}
public function setDefaultValidationMethod(string $defaultValidationMethod): static
{
$this->defaultValidationMethod = $defaultValidationMethod;
return $this;
}
public function getActivityConfig(): ?array
{
return $this->activityConfig;
}
public function setActivityConfig(?array $activityConfig): static
{
$this->activityConfig = $activityConfig;
return $this;
}
public function getSummary(): ?string
{
return $this->summary;
}
public function setSummary(?string $summary): static
{
$this->summary = $summary;
return $this;
}
public function getImageFilename(): ?string
{
return $this->imageFilename;
}
public function setImageFilename(?string $imageFilename): static
{
$this->imageFilename = $imageFilename;
return $this;
}
public function getRewards(): ?string
{
return $this->rewards;
}
public function setRewards(?string $rewards): static
{
$this->rewards = $rewards;
return $this;
}
/**
* Get activity configuration for a specific activity
*/
public function getActivityConfigurationForActivity(Activity $activity): ?ActivityConfiguration
{
foreach ($this->activityConfigurations as $activityConfiguration) {
if ($activityConfiguration->getActivity() === $activity) {
return $activityConfiguration;
}
}
return null;
}
/**
* Get all enabled activities for this season
*
* @return Collection<int, Activity>
*/
public function getEnabledActivities(): Collection
{
$activities = new ArrayCollection();
foreach ($this->activityConfigurations as $activityConfiguration) {
if ($activityConfiguration->isIsEnabled()) {
$activities->add($activityConfiguration->getActivity());
}
}
return $activities;
}
public function getGoogleChatConfig(): ?SeasonGoogleChatConfig
{
return $this->googleChatConfig;
}
public function setGoogleChatConfig(SeasonGoogleChatConfig $googleChatConfig): static
{
// set the owning side of the relation if necessary
if ($googleChatConfig->getSeason() !== $this) {
$googleChatConfig->setSeason($this);
}
$this->googleChatConfig = $googleChatConfig;
return $this;
}
public function getUseBalancedScoring(): bool
{
return $this->useBalancedScoring;
}
public function setUseBalancedScoring(bool $useBalancedScoring): static
{
$this->useBalancedScoring = $useBalancedScoring;
return $this;
}
}