<?php
namespace App\Controller;
use App\Entity\RigCard;
use App\Enum\Currency;
use App\Entity\ExchangeRate;
use App\Entity\Expense;
use App\Entity\Farm;
use App\Entity\Location;
use App\Entity\Log;
use App\Entity\Payout;
use App\Entity\Plug;
use App\Entity\Rig;
use App\Entity\User;
use App\Entity\Wallet;
use App\Entity\Wat;
use App\Form\CardEfficiencyType;
use App\Form\FilterType;
use App\Form\RigCardType;
use App\Model\CardEfficiencyModel;
use App\Model\CurrentPowerModel;
use App\Model\FilterModel;
use App\Model\RigCardModel;
use App\Service\ChartService;
use App\Service\ExportService;
use App\Service\ExpenseService;
use App\Service\HelperService;
use App\Service\WTMService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\Expr\Join;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
class DefaultController extends AbstractController
{
#[Route('/', name: 'homepage')]
public function index(Request $request, ChartService $chartService, EntityManagerInterface $em, ExpenseService $feeService): Response
{
/** @var User $user */
$user = $this->getUser();
$filters = new FilterModel();
$form = $this->createForm(FilterType::class, $filters);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
$estimate = $em->getRepository(Wallet::class)->estimates($user);
$lastDay = strtotime('last day of '.$filters->getMonth()->format('F'));
return $this->renderForm('default/index.html.twig', [
'filters' => $filters,
'form' => $form,
'payoutChart' => $chartService->payouts($user, $filters),
'payoutFiatChart' => $chartService->payouts($user, $filters, true),
'payoutSummary' => $em->getRepository(Payout::class)->summary($user, $filters),
'lastPayouts' => $em->getRepository(Payout::class)->getLastByCurrency($user, $filters),
'watsChart' => $chartService->wats($user, $filters),
'watsSummary' => $em->getRepository(Wat::class)->summary($user, $filters),
'exchangeRateSummary' => $em->getRepository(ExchangeRate::class)->summary($filters->getMonth()),
'tempsCharts' => $chartService->temps($user, $filters),
'expenses' => $em->getRepository(Expense::class)->summary($user, $filters),
'fees' => $feeService->calcFee($user, $filters),
'estimateEarning' => $estimate,
'estimateEarningToEndMonth' => $estimate * 24 * (date('d', $lastDay) - date('d', $filters->getMonth()->format('Y-m') === date('Y-m') ? time() : $lastDay))
]);
}
#[Route('/farms', name: 'farms')]
#[Route('/farms/{farm}', name: 'farms_id')]
public function farms(EntityManagerInterface $em, ?Farm $farm = null): Response
{
/** @var User $user */
$user = $this->getUser();
return $this->renderForm('default/farms.html.twig', [
'selectedFarm' => $farm,
'farms' => $em->getRepository(Rig::class)->getFarmList($user),
'estimateEarning' => $em->getRepository(Wallet::class)->estimates($user),
]);
}
#[Route('/locations', name: 'locations')]
#[Route('/locations/{location}', name: 'locations_id')]
public function locations(Request $request, EntityManagerInterface $em, ChartService $chartService, ?Location $location = null): Response
{
/** @var User $user */
$user = $this->getUser();
if(!$location) {
$location = $user->getLocations()->first()?:null;
}
if(!$location) {
throw $this->createNotFoundException();
}
$filters = new FilterModel();
$form = $this->createForm(FilterType::class, $filters);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
$filters->setLocation($location);
$users = [];
foreach ($em->getRepository(User::class)->findByLocation($location) as $u) {
$users[] = [
'value' => $u,
'watsSummary' => $em->getRepository(Wat::class)->summary($u, $filters),
];
}
return $this->renderForm('default/locations.html.twig', [
'filters' => $filters,
'form' => $form,
'location' => $location,
'watsSummary' => $em->getRepository(Wat::class)->summary($user, $filters, true),
'watsChart' => $chartService->wats($user, $filters, true),
'users' => $users,
'lastPower' => $em->getRepository(Plug::class)->lastPower((new CurrentPowerModel())->setLocation($location)),
]);
}
#[Route('/logs', name: 'logs')]
#[Route('/logs/{rig}', name: 'logs_rig')]
public function logs(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator, ?Rig $rig = null): Response
{
/** @var User $user */
$user = $this->getUser();
$pagination = $paginator->paginate(
$em->getRepository(Log::class)->getByUserAndRigQb($user, $rig)->getQuery(),
$request->query->getInt('page', 1),
10
);
return $this->renderForm('default/logs.html.twig', [
'selectedRig' => $rig,
'pagination' => $pagination,
]);
}
#[Route('/users', name: 'users')]
#[IsGranted('ROLE_SUPER_ADMIN')]
public function users(Request $request, ChartService $chartService, EntityManagerInterface $em, ExpenseService $feeService): Response
{
$users = $em->getRepository(User::class)->findBy([]);
$usersData = [];
$filters = new FilterModel();
$form = $this->createForm(FilterType::class, $filters);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
foreach ($users as $user) {
$usersData[] = [
'user' => $user,
'expenses' => $em->getRepository(Expense::class)->summary($user, $filters),
'watsSummary' => $em->getRepository(Wat::class)->summary($user, $filters),
'payoutSummary' => $em->getRepository(Payout::class)->summary($user, $filters),
'fees' => $feeService->calcFee($user, $filters),
];
}
$exchangeRateSummary = $em->getRepository(ExchangeRate::class)->summary($filters->getMonth());
$sumWatPLN = 0;
$sumExpenses = ['PLN' => 0];
foreach($usersData as $user) {
$sumWatPLN += $user['watsSummary']['PLN'];
foreach($user['fees'] as $currency => $price) {
if(!isset($sumExpenses[$currency])) {
$sumExpenses[$currency] = 0;
}
$sumExpenses[$currency] += $price;
if($currency === 'USD') {
$sumExpenses['PLN'] += $price * $exchangeRateSummary['PLN']['USD'];
}
else {
$sumExpenses['PLN'] += $price * $exchangeRateSummary[$currency]['PLN'];
}
}
}
return $this->renderForm('default/users.html.twig', [
'filters' => $filters,
'form' => $form,
'users' => $usersData,
'sumWatPLN' => $sumWatPLN,
'sumExpenses' => $sumExpenses,
'exchangeRateSummary' => $exchangeRateSummary,
]);
}
#[Route('/payouts.xls', name: 'payouts')]
public function payouts(Request $request, ExportService $exportService): Response
{
/** @var User $user */
$user = $this->getUser();
$filters = new FilterModel();
$form = $this->createForm(FilterType::class, $filters);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
return $exportService->payouts($user, $filters);
}
#[Route('/cards', name: 'cards')]
public function cards(Request $request, WTMService $WTMService): Response
{
/** @var User $user */
$user = $this->getUser();
$filters = new CardEfficiencyModel();
$form = $this->createForm(CardEfficiencyType::class, $filters);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
$cards = $WTMService->getCards($filters);
$currencies = $WTMService->getCurrencies($cards);
return $this->renderForm('default/cards.html.twig', [
'filters' => $filters,
'form' => $form,
'cards' => $cards,
'currencies' => $currencies,
]);
}
#[Route('/rig_cards', name: 'rig_cards')]
public function rig_cards(Request $request, EntityManagerInterface $em): Response
{
/** @var User $user */
$user = $this->getUser();
$filters = new RigCardModel();
$filters->setUser($user);
$form = $this->createForm(RigCardType::class, $filters, ['user' => $user]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$filters = $form->getData();
}
return $this->renderForm('default/rig_cards.html.twig', [
'filters' => $filters,
'form' => $form,
'cards' => $em->getRepository(RigCard::class)->getCards($filters),
]);
}
#[Route('/test', name: 'test')]
public function test(Request $request, EntityManagerInterface $em): Response
{
$em->getRepository(Wat::class)->add($em->getRepository(Rig::class)->find(407), 10);
return $this->renderForm('base.html.twig');
}
}