<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Address;
class MainController extends AbstractController
{
/**
* @Route("/", name="app_login", methods={"GET", "POST"})
*/
public function login(Request $request, MailerInterface $mailer): Response
{
if ($request->isMethod('POST')) {
$email = $request->request->get('email');
// Generate a 6-digit OTP code
$code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT);
// Store in session
$session = $request->getSession();
$session->set('otp_code', $code);
$session->set('otp_email', $email);
// Send email
$browser = $request->headers->get('User-Agent');
if (strpos($browser, 'Chrome') !== false) {
$browserName = 'Chrome, Windows';
} else {
$browserName = 'Browser';
}
$emailMessage = (new TemplatedEmail())
->from(new Address('not-reply@pay-engineers.online', 'Trustyfy'))
->to($email)
->subject('Log in to Trustyfy')
->htmlTemplate('emails/otp.html.twig')
->context([
'code' => $code,
'browser' => $browserName,
'time' => (new \DateTime())->format('Y-m-d H:i:sP')
]);
try {
$mailer->send($emailMessage);
} catch (\Exception $e) {
// Ignore exception if mailer is not configured
}
return $this->redirectToRoute('app_otp');
}
return $this->render('main/login.html.twig');
}
/**
* @Route("/otp", name="app_otp", methods={"GET", "POST"})
*/
public function otp(Request $request): Response
{
$session = $request->getSession();
$email = $session->get('otp_email');
$error = null;
if (!$email) {
return $this->redirectToRoute('app_login');
}
if ($request->isMethod('POST')) {
$submittedCode = $request->request->get('code');
$storedCode = $session->get('otp_code');
if ($submittedCode === $storedCode) {
// Code is correct, login successful
$session->remove('otp_code');
$session->set('is_authenticated', true);
return $this->redirectToRoute('app_dashboard');
} else {
$error = 'Invalid or expired code.';
}
}
return $this->render('main/otp.html.twig', [
'email' => $email,
'error' => $error
]);
}
/**
* @Route("/dashboard", name="app_dashboard")
*/
public function dashboard(Request $request): Response
{
if (!$request->getSession()->get('is_authenticated')) {
return $this->redirectToRoute('app_login');
}
// Calculate penalty multiplier (increments by 1 every 24 hours)
// Start date: 2026-05-30 00:00:00
$startDate = new \DateTime('2026-05-30 00:00:00');
$now = new \DateTime();
$interval = $startDate->diff($now);
$days = (int)$interval->format('%r%a');
// Multiplier starts at 2, and increases by 1 for each day elapsed
$penaltyMultiplier = max(2, 2 + $days);
$penaltyBaseAmount = 1310 * $penaltyMultiplier;
$penaltyAmount = $penaltyBaseAmount * 0.015;
return $this->render('main/dashboard.html.twig', [
'penaltyMultiplier' => $penaltyMultiplier,
'penaltyBaseAmount' => $penaltyBaseAmount,
'penaltyAmount' => $penaltyAmount
]);
}
/**
* @Route("/settings", name="app_settings")
*/
public function settings(Request $request): Response
{
if (!$request->getSession()->get('is_authenticated')) {
return $this->redirectToRoute('app_login');
}
return $this->render('main/settings.html.twig');
}
/**
* @Route("/maintenance", name="app_maintenance")
*/
public function maintenance(): Response
{
return $this->render('main/maintenance.html.twig');
}
}