<?php

// src/Controller/DataImport.php
// Grab data from transfer app

namespace App\Controller\Routes\Back;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RequestStack;
use Doctrine\Persistence\ManagerRegistry;
use App\Service\HandleLocations;
use Doctrine\DBAL\Connection;
use App\Service\Auth;
use App\Service\FileUploader;
use App\Service\Render;

class Locations extends AbstractController
{
    /**
     * @Route("/den/locations", name="den-reroute-index")
     */
    public function rerouteIndex()
    {
        header("Location:/den/locations/page/1");
        return new Response("<html><body>LOGGED IN</body></html>");
    }

    /**
     * @Route("/den/locations/page/{pageNum}", name="den-locations")
     */
    public function locationIndex(
        Request $request,
        RequestStack $requestStack,
        Auth $auth,
        HandleLocations $locations,
        ManagerRegistry $doctrine,
        Connection $connection,
        Render $render,
        string $pageNum
    ): Response {
        $result = $auth->status();
        if ($result["status"]) {
            $session = $requestStack->getSession();
            $member  = $session->get("member");
            $list    = $locations->getLocationsPage($pageNum);

            //$search = $connection->fetchAllAssociative("SELECT * FROM searchlocations('agenda')");
            return $render->page(["list" => $list, "mode" => "index"], "Bad Space | Locations", "back/locations.twig");
        } else {
            return $this->render("back/index.twig", [
                "title" => "Close the door behind you",
            ]);
        }
    }

    /**
     * @Route("/den/locations/modify/{action}/{uuid}", name="location-modify")
     */
    public function modifyLocation(
        Request $request,
        Auth $auth,
        HandleLocations $locations,
        ManagerRegistry $doctrine,
        FileUploader $uploader,
        Render $render,
        string $action = "add",
        string $uuid = "001"
    ): Response {
        $result = $auth->status();
        if ($result["status"]) {
            if ($request->getMethod() == "GET") {
                $options = [];
                if ($action == 'add') {
                    return $render->page(
                        ["mode" => $action],
                        "Bad Space | Locations | Add",
                        "back/locations.twig"
                    );
                } else {
                    $location = $locations->getLocationbyUUID($uuid);
                    return $render->page(
                        ["mode" => $action, "location" => $location[0]],
                        "Bad Space | Locations | Edit",
                        "back/locations.twig"
                    );
                }
            } else {
                //add new member
                $token  = $request->get("token");
                $notice = "";
                $mode   = $request->get("mode");

                //token check
                if (!$this->isCsrfTokenValid("upload", $token)) {
                    $logger->info("CSRF failure");

                    return new Response(
                        "Operation not allowed",
                        Response::HTTP_BAD_REQUEST,
                        [
                            "content-type" => "text/plain",
                        ]
                    );
                }

                if (
                    $request->request->get("loc_name") == "" ||
                    $request->request->get("loc_url") == "" ||
                    $request->request->get("loc_desc") == "" ||
                    $request->request->get("loc_tags") == ""
                ) {
                    $notice = "All fields are required, champ.";
                    return $render->page(
                        ["mode" => "add", "notice" => $notice],
                        "Bad Space | Locations | Add",
                        "back/locations.twig"
                    );
                }

                //once everything clears, upload images and process request
                $examples = [];
                $files    = $request->files->get("loc_examples");
                if (!empty($files)) {
                    for ($i = 0; $i < count($files); $i++) {
                        $path = $files[$i]->getClientOriginalName();
                        array_push($examples, ["image_index" => $i, "path" => urlencode($path)]);
                        $uploader->uploadExamples("../public/assets/images/examples", $files[$i]);
                    }
                }
                $response = $locations->modifyLocation($request, $result["id"], $mode, $request->request->get("uuid"));
                if ($response["status"]) {
                    if ($mode == 'add') {
                        return $render->page(
                            ["mode" => $mode, "notice" => $response["message"]],
                            "Bad Space | Locations | Add",
                            "back/locations.twig"
                        );
                    } else {
                        $location = $locations->getLocationbyUUID($request->request->get("uuid"));
                        return $render->page(
                            ["mode" => $mode, "notice" => $response["message"], "location" => $location[0]],
                            "Bad Space | Locations | Edit",
                            "back/locations.twig"
                        );
                    }
                } else {
                    return $render->page(
                        ["mode" => $mode, "notice" => $response["message"]],
                        "Bad Space | Locations | Error",
                        "back/locations.twig"
                    );
                }
            }
        } else {
            //back to index to login
            header("Location:/den");
            return new Response("<html><body>LOGGED IN</body></html>");
        }
    }

    /**
     * @Route("/den/locations/bulk-add", name="location-bulk-add")
     */
    public function bulkAddLocation(
        Request $request,
        Auth $auth,
        HandleLocations $locations,
        ManagerRegistry $doctrine,
        FileUploader $uploader,
        Render $render
    ): Response {
        $result = $auth->status();
        if ($result["status"]) {
            if ($request->getMethod() == "GET") {
                return $render->page(
                    ["mode" => "bulk-add"],
                    "Bad Space | Locations | Bulk Add",
                    "back/locations.twig"
                );
            } else {
                // do posting stuff
                $token         = $request->get("token");
                $entityManager = $doctrine->getManager();
                $notice        = '';

                if (!$this->isCsrfTokenValid("upload", $token)) {
                    $logger->info("CSRF failure");
                    return new Response(
                        "Operation not allowed",
                        Response::HTTP_BAD_REQUEST,
                        [
                            "content-type" => "text/plain",
                        ]
                    );
                }
                //get file from post
                $file = $request->files->get("myfile");
                //grab extension
                if (!empty($file)) {
                    $extention = substr(strrchr($file->getClientOriginalName(), "."), 1);
                }

                //check it out to make sure it's cool
                if (
                    empty($file) ||
                    $extention != "csv"
                ) {
                    if (empty($file)) {
                        $notice = 'You didn\'t select a file, boss';
                    } elseif ($extention != "csv") {
                        $notice = "Only files of type .csv are accepted, slick. " . $extention;
                    }

                    return $this->render("back/locations.twig", [
                        "title"  => "Bad Space | Locations | Add",
                        "notice" => $notice,
                        "mode"   => "bulk-add"
                    ]);
                }
                //if it's cool, send it to be processed
                $response = $locations->addMultipleLocations($file, $result["id"]);
                if ($response["status"]) {
                    $notice = "New locations added! Take a break.";
                    return $render->page(
                        ["mode" => "bulk-add", "notice" => $response["message"], ],
                        "Bad Space | Locations | Bulk Add",
                        "back/locations.twig"
                    );
                } else {
                    return $render->page(
                        ["mode" => "bulk-add", "notice" => $response["message"], ],
                        "Bad Space | Locations | Bulk Add",
                        "back/locations.twig"
                    );
                }
            }
        } else {
            header("Location:/den");
            return new Response("<html><body>LOGGED IN</body></html>");
        }
    }
}