<?php

namespace App\Controller\Campaign;

use App\Service\Campaign\OrganicOverviewCheckService;
use App\Service\DataGrid\DataGrid;
use App\Service\DataGrid\DataGridFilterMultiselect;
use App\Service\DataGrid\DataGridHeader;
use App\Service\DataGrid\DataGridNavigation;
use App\Service\DataGrid\DataGridSort;
use Doctrine\ORM\EntityNotFoundException;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class OrganicOverviewCheckController extends AbstractFOSRestController
{
    private $service;

    public function __construct(OrganicOverviewCheckService $service)
    {
        $this->service = $service;
    }

    /**
     * Retrieves a collection of OrganicOverviewCheck resource.
     *
     * @Rest\Get("/campaign/organic/grid")
     * @Rest\View(serializerGroups={"grid"})
     *
     * @param Request $request
     *
     * @return View
     */
    public function getGridAction(Request $request): View
    {
        $dataGrid = new DataGrid();

        $dataGrid
            ->setName('Campaign Organic Overview Check')
            ->addHeader(new DataGridHeader(['label' => 'Campaign', 'id' => 'campaign', 'type' => 'campaign', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Total', 'id' => 'total', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Visibility', 'id' => 'visibility', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Difference Visibility', 'id' => 'differenceVisibility', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100', 'id' => 'top100', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100 Improved', 'id' => 'top100Improved', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100 Declined', 'id' => 'top100Declined', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100 Difference', 'id' => 'top100Difference', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100 Left', 'id' => 'top100Left', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 100 Entered', 'id' => 'top100Entered', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3', 'id' => 'top3', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3 Improved', 'id' => 'top3Improved', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3 Declined', 'id' => 'top3Declined', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3 Difference', 'id' => 'top3Difference', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3 Left', 'id' => 'top3Left', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 3 Entered', 'id' => 'top3Entered', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10', 'id' => 'top10', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10 Improved', 'id' => 'top10Improved', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10 Declined', 'id' => 'top10Declined', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10 Difference', 'id' => 'top10Difference', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10 Left', 'id' => 'top10Left', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 10 Entered', 'id' => 'top10Entered', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20', 'id' => 'top20', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20 Improved', 'id' => 'top20Improved', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20 Declined', 'id' => 'top20Declined', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20 Difference', 'id' => 'top20Difference', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20 Left', 'id' => 'top20Left', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Top 20 Entered', 'id' => 'top20Entered', 'isSortable' => true]))
            ->addHeader(new DataGridHeader(['label' => 'Data', 'id' => 'data', 'isSortable' => true]));

        $dataGrid->setNavigation(new DataGridNavigation(['page' => $request->get('page'), 'rpp' => $request->get('rpp')]));

        $dataGrid->addSorter(new DataGridSort(['sort' => $request->get('sort'), 'order' => $request->get('order')]));

        $dataGrid->addFilter(new DataGridFilterMultiselect(
            'campaign',
            [],
            $request->get('campaign') ?? []));

        $dataGrid->setData($this->service->getByGrid($dataGrid))
            ->setTotal($this->service->countByGrid($dataGrid));

        return View::create($dataGrid, Response::HTTP_OK);
    }

    /**
     * Retrieves an OrganicOverviewCheck resource.
     *
     * @Rest\Get("/campaign/organic/{id}", requirements={"id"="\d+"}))
     *
     * @param int $id
     *
     * @return View
     */
    public function getAction(int $id): View
    {
        try {
            $organicOverviewCheck = $this->service->get($id);

            return View::create($organicOverviewCheck, Response::HTTP_OK);
        } catch (EntityNotFoundException $e) {
            return View::create(['code' => Response::HTTP_NOT_FOUND, 'message' => $e->getMessage()], Response::HTTP_NOT_FOUND);
        }
    }

    /**
     * Removes the OrganicOverviewCheck resource.
     *
     * @Rest\Delete("/campaign/organic/{id}")
     *
     * @param int $id
     *
     * @return View
     */
    public function deleteAction(int $id): View
    {
        try {
            $organicOverviewCheck = $this->service->get($id);
        } catch (EntityNotFoundException $e) {
            return View::create(['code' => Response::HTTP_BAD_REQUEST, 'message' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
        }

        $this->service->delete($organicOverviewCheck);

        return View::create([], Response::HTTP_NO_CONTENT);
    }
}
