<?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 App\Service\HandleImports;
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,
        Render $render,
        string $pageNum
    ): Response {
        $result = $auth->status();
        if ($result["status"]) {
            $session = $requestStack->getSession();
            $member  = $session->get("member");
            $list    = $locations->getLocationsPage($pageNum);

            $next = $pageNum + 1;
            if ($next > $list["total"]) {
                $next = 1;
            }

            $prev = $pageNum - 1;

            if ($prev <= 0) {
                $prev = $list["total"];
            }
            return $render->page(
                [
                    "list"       => $list,
                    "mode"       => "index",
                    "curentPage" => $pageNum,
                    "nextPage"   => $next,
                    "prevPage"   => $prev
                ],
                "Bad Space | Locations",
                "back/locations.twig"
            );
        } else {
            return $render->page([], "The Bad Space | Den", "back/index.twig");
        }
    }

    /**
     * @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,
        HandleImports $imports,
        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        = '';
                $type          = $request->get("input_type");
                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
                if ($type == "tbs" || $type == "") {
                    $response = $locations->addMultipleLocations($file, $result["id"]);
                } else {
                    $response = $imports->importLocations($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>");
        }
    }
}
