<?php

namespace App\Repositories;

use App\Models\Location;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;

class LocationRepository
{
    protected $model;

    public function __construct(Location $model)
    {
        $this->model = $model;
    }

    public function search($request)
    {
        // this grabs the search results from the db
        $terms     = $request->index_search;
        $rawSearch = $terms;
        $terms     = str_replace(",", "", $terms);
        $terms     = str_replace(" ", "|", $terms);
        $raw       = DB::select("SELECT * FROM searchlocations(?)", [$terms]);
        $results   = [];
        foreach ($raw as $item) {
            if (($item->block_count + $item->silence_count) >= 2) {
                array_push($results, $item);
            }
        }

        return $results;
    }

    public function getLocation($type)
    {
        if (!is_string($type) || (preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/', $type) !== 1)) {
            return $this->model::where("url", $type)->first();
        } else {
            return $this->model::where("uuid", $type)->first();
        }
    }

    public function getActiveLocations()
    {
        return $this->model::where("active", true)->where('actions_count', '>=', 2)->get();
    }

    public function getRecent()
    {
        return $locations = $this->model::where("active", true)->where('actions_count', '>=', 2)
            ->orderByDesc('updated_at')->limit(10)->get();
    }

    public function editLocation($request)
    {
        $location   = $this->getLocation($request->id);
        $publicPath = '../public/';
        $refPath    = 'assets/images/references/' . $location->uuid;
        $images     = [];
        if ($request->hasfile("references")) {
            foreach ($request->references as $file) {
                if (!is_dir($publicPath . $refPath)) {
                    mkdir($publicPath . $refPath, 0755, true);
                }
                $filename = urlencode($file->getClientOriginalName());
                $file->move($publicPath . $refPath, $filename);
                //$path = $file->store('reference');
                array_push($images, ["path" => '/' . $refPath . '/' . $filename]);
            }
        }
        if (!empty($images)) {
            $request->merge(['images' => json_encode($images)]);
            $location->images = json_encode($images);
        }

        $location->name          = $request->name;
        $location->notes         = $request->notes;
        $location->archive_links = $request->archive_links;

        $result = [];

        if ($location->save()) {
            return ['status' => true, 'message' => "Location Editited" . $request->hasfile("references")];
        } else {
            return ['status' => false, 'message' => "Location Not Editited"];
        }
    }

    public function addLocation(Request $request)
    {
        $fields = $request->validate([
            'name'        => ['required'],
            'url'         => ['required'],
            'description' => ['required'],
            'tags'        => ['required'],
        ]);

        if ($fields) {
            $examples = [];
            $files    = $request->files->get("loc_examples");
            if ($request->hasfile('loc_examples')) {
                foreach ($request->file('loc_examples') as $file) {
                    $path = $file->store('reference');
                    array_push($examples, ["path" => $path]);
                }
            }
            $request->merge(['active' => true]);
            $request->merge(['uuid' => Uuid::uuid4()]);
            $request->merge(['images' => json_encode($examples)]);
            $request->merge(['added_by' => Auth::user()->id]);
            //NOTE: Laravel gets funky if sequencing isn't explicitly set
            $new = Location::create($request->all());
            if ($new) {
                return back()->with('message', 'New Location Added. Take a break!');
            } else {
                return back()->withErrors([
                    'error' => 'Uh oh. There was an inssue',
                ]);
            }
        } else {
            return back()->withErrors([
                'error' => 'All fields are required',
            ]);
        }
    }
}