<?php

namespace App\Controller\Prospect;

use App\DTO\ProspectDTO;
use App\Service\Prospect\MultiFactory;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\View\View;
use League\Csv\Exception;
use League\Csv\Reader;
use League\Csv\Statement;
use League\Flysystem\Filesystem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;

class ImportController extends FOSRestController
{
    private $filesystem;
    /**
     * @var MessageBusInterface
     */
    private $bus;
    /**
     * @var MultiFactory
     */
    private $multiFactory;

    public function __construct(Filesystem $filesystem, MessageBusInterface $bus, MultiFactory $multiFactory)
    {
        $this->filesystem = $filesystem;
        $this->bus = $bus;
        $this->multiFactory = $multiFactory;
    }

    /**
     * @Rest\Post("/prospect/import")
     *
     * @param Request $request
     *
     * @return View
     *
     * @throws Exception
     */
    public function import(Request $request): View
    {
        if ($request->files->get('file')) {
            $file = $request->files->get('file');

            if (!$file || !$file->isValid()) {
                return View::create(['code' => Response::HTTP_BAD_REQUEST, 'message' => 'File has not been uploaded'], Response::HTTP_BAD_REQUEST);
            }

            if (false !== ($handle = fopen($file->getRealPath(), 'r'))) {
                $file = stream_get_contents($handle);
                $csv = Reader::createFromString($file);
                $csv->setDelimiter(',');
                $csv->setHeaderOffset(0);
                $stmt = new Statement();
                $records = $stmt->process($csv);
                $prospects = [];
                foreach ($records as $record) {
                    $prospects[] = $record;
                }
                fclose($handle);

                $prospects = array_map(function ($row) { return new ProspectDTO($row['Website'], $row['Email'], $row['Contact URL']); },
                    $prospects);
            }
        } elseif ($prospects = $request->get('prospects')) {
            $prospects = explode(PHP_EOL, $prospects);
            $prospects = array_map(function ($row) {
                $row = explode(',', $row);

                return new ProspectDTO($row[0],
                    $row[1], $row[2]);
            },
                $prospects);
        } else {
            return View::create(['code' => Response::HTTP_BAD_REQUEST, 'message' => 'Data is incorrect '],
                Response::HTTP_BAD_REQUEST);
        }

        $response = $this->multiFactory->produce($prospects);

        return View::create(['response' => $response], Response::HTTP_OK);
    }
}
