<?php
namespace App\Controller;
use App\Entity\SiteBannedIps;
use App\Form\BannedIpsForm;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\Filters\BannedIpFilter;
use App\Form\Filters\ExportFilter;
use App\Repository\ExportFilesRepository;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Service\ServiceStorage;
use App\Service\ExportFiles;
use League\Csv\Writer;
use League\Csv\Reader;
#[Route('/task/export')]
class ExportController extends AbstractController
{
#[Route('/', defaults: ['page' => '1'], methods: ['GET'], name: 'export_index')]
#[Route('/page/{page<[1-9]\d*>}', methods: ['GET'], name: 'export_index_paginated')]
#[Cache(smaxage: 10)]
public function index(Request $request,int $page,EntityManagerInterface $entityManager,ExportFilesRepository $exportFilesRepository): Response
{
$params = $request->query->all();
$filter = [];
$filterForm = $this->createForm(ExportFilter::class);
if(isset($params['start_date'])) {
$filterForm['start_date']->setData($params['start_date']);
$filter['start_date'] = $params['start_date'];
}
if(isset($params['end_date'])) {
$filterForm['end_date']->setData($params['end_date']);
$filter['end_date'] = $params['end_date'];
}
if(isset($params['export_type'])){
$filterForm['export_type']->setData($params['export_type']);
$filter['export_type'] = $params['export_type'];
}
$data = $exportFilesRepository->adminPaginatorFetchAll($page, $filter);
return $this->render('export/index.html.twig', [
'paginator' => $data,
'filter' => $filter,
'form' => $filterForm->createView(),
]);
}
#[Route('/submit', name: 'export_submit', methods: ['GET', 'POST'])]
public function submit(Request $request,EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, ExportFiles $exportfilesService, ServiceStorage $serviceStorage): Response
{
$data = array();
$params = $request->query->all();
if ($request->isMethod('post')) {
//echo 'hi';exit;
$params = $request->request->all();
$decodeData = json_decode($params['form_value']);
//print_r($decodeData);exit;
$outputArray = [];
foreach ($decodeData as $stdClassObject) {
$stdClassArray = (array)$stdClassObject;
$outputArray = array_merge($outputArray, $stdClassArray);
}
$filter = array();
if($outputArray){
foreach($outputArray as $key => $output){
if(!empty($output) && $output !== 'undefined'){
if($key != 'title' && $key != 'type') {
$filter[$key] = $output;
}
}
}
}
$title = isset($outputArray['title']) ? $outputArray['title'].' - ' : 'File - ';
if(isset($filter['start_at']) && isset($filter['end_at'])){
$title .= date('d/m/y',strtotime($filter['start_at'])) .' To '.date('d/m/y',strtotime($filter['end_at']));
}else{
if(isset($filter['date'])){
$title .= 'Export last '.$filter['date'].' days';
}
}
/* print_r($outputArray['type']).'<br>';
print_r($filter);exit; */
$userId = $this->getUser()->getUserId();
$getData = $exportfilesService->getQueryByExportType($outputArray['type'], $filter);
if($getData === false){
return false;
}
$export_file_name = 'Heypa-'.str_replace('_', '-', $outputArray['type']).'.csv';
$column_name = $getData['column'];
$result = $getData['result'];
//print_r($result);exit;
$uploadDir = 'uploads/export/'.uniqid('export_', true).'/' ;
// Check if the directory exists, create it if not
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// Generate a unique name to prevent overwriting files
$fileExt = pathinfo($export_file_name, PATHINFO_EXTENSION);
$uniqueName = $fileExt;
// Set the destination path
$fileDestination = $uploadDir . $export_file_name;
//echo $fileDestination;exit;
$csvColumns = $column_name;
$norecode =array( "No Records Found.");
$csv = Writer::createFromFileObject(new \SplTempFileObject());
$csv->insertOne($csvColumns);
// Insert data or 'No Records Found' row
if ($result) {
foreach ($result as $item) {
$csv->insertOne($item);
}
} else {
$csv->insertOne($norecode);
}
file_put_contents($fileDestination, $csv->getContent());
$exportFiles = new \App\Entity\ExportFiles();
$exportFiles->setUserId($userId);
$exportFiles->setExportFile($title);
$exportFiles->setExportType($outputArray['type']);
$exportFiles->setExportFilters(json_encode($filter));
$exportFiles->setDownloadPath($fileDestination);
$exportFiles->setCreatedAt(new \Datetime());
$entityManager->persist($exportFiles);
$entityManager->flush();
// $url = $urlGenerator->generate('export_index');
$response = new Response($csv->getContent());
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $export_file_name . '"');
$response->headers->set('Cache-Control', 'no-store, no-cache, must-revalidate');
$response->headers->set('Pragma', 'public');
return $response;
//return new Response($data,'CSV process successfully');
//return new Response('<div class="download-submit-sec p-3"><div class="alert p-0 mb-3">Download started. <a href="'.$url.'">Click link</a> to review download process.</div><a href="javascript:void(0)" class="cancel btn btn-outline-secondary close_custom_modal">Cancel</a></div>');
}
return $this->render('export/submit.html.twig', [
'params' => $params,
]);
}
}