<?php
namespace App\Entity;
use App\Service\StatisticsDataAggregation;
use App\Service\WorldMap;
use App\Twig\FlagExtension;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\ReportPageStatisticRepository")
* @ORM\Table(name="`report_page_statistic`")
*/
class ReportPageStatistic
{
use TimestampableEntity;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Report", inversedBy="pageStatistics")
* @ORM\JoinColumn(name="report_id", referencedColumnName="id")
*/
private Report $report;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ReportSnapshot", inversedBy="pageStatistics")
* @ORM\JoinColumn(name="report_snapshot_id", referencedColumnName="id")
*/
private ?ReportSnapshot $snapshot = null;
/**
* @ORM\Column(type="text")
*/
private ?string $url;
/**
* @ORM\Column(type="float")
*/
private ?float $kWh;
/**
* @ORM\Column(type="float")
*/
private ?float $tCO2;
/**
* @ORM\OneToMany(targetEntity="App\Entity\ReportPageCountryStatistic", mappedBy="pageStatistic", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private ?Collection $countryStatistics;
public function __construct()
{
$this->countryStatistics = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getReport(): Report
{
return $this->report;
}
public function setReport(Report $report): void
{
$this->report = $report;
}
public function getSnapshot(): ?ReportSnapshot
{
return $this->snapshot;
}
public function setSnapshot(?ReportSnapshot $snapshot): void
{
$this->snapshot = $snapshot;
}
public function getUrl(): ?string
{
return $this->url;
}
public function setUrl(?string $url): void
{
$this->url = $url;
}
public function getKWh(): ?float
{
return $this->kWh;
}
public function setKWh(?float $kWh): void
{
$this->kWh = $kWh;
}
public function getTCO2(): ?float
{
return $this->tCO2;
}
public function setTCO2(?float $tCO2): void
{
$this->tCO2 = $tCO2;
}
public function getCountryStatistics(string $field = 'tCO2', string $criteria = Criteria::DESC): ?Collection
{
$criteria = Criteria::create()
->orderBy(
[
$field => $criteria,
]
);
return $this->countryStatistics->matching($criteria);
}
public function setCountryStatistics(?Collection $countryStatistics): void
{
$this->countryStatistics = $countryStatistics;
}
public function getData(): array
{
$totalEmissionsByNations['tCO2'] = [];
$totalEmissionsByNations['kWh'] = [];
foreach ($this->getCountryStatistics() as $statistic) {
$totalEmissionsByNations['tCO2'][FlagExtension::getFlagNameAlpha3($statistic->getCode())] = $statistic->getTCO2();
}
foreach ($this->getCountryStatistics('kWh') as $statistic) {
$totalEmissionsByNations['kWh'][FlagExtension::getFlagNameAlpha3($statistic->getCode())] = $statistic->getkWh();
}
$groupedTotalEmissions = WorldMap::mergeTotalEmissions(
$totalEmissionsByNations['tCO2'],
$totalEmissionsByNations['kWh'],
);
return [
'totals' => $groupedTotalEmissions,
'tCO2' => StatisticsDataAggregation::compact($totalEmissionsByNations['tCO2']),
'kWh' => StatisticsDataAggregation::compact($totalEmissionsByNations['kWh']),
];
}
}