<?php

namespace App\Http\Controllers;

use App\Models\Author;
use App\Models\Book;
use App\Models\Location;
use App\Services\BookInformation\BookLookupService;
use App\Services\BookInformation\GoogleBooks;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class MainController extends Controller {
    public function index() {
        $rows = Book::paginate(15);

        return view('index', [ 'rows' => $rows ]);
    }

    public function search(Request $request) {
        $rows = Book::search($request->get('query'))->paginate(15);

        return view('index', [ 'rows' => $rows ]);
    }

    public function add(Request  $request) {
        return view('add', [
            'locations' => Location::get(),
            'old' => array_filter($request->old('books', []), function($item) {
                return !empty($item['barcode']);
            })
        ]);
    }

    public function save(Request $request, BookLookupService $service) {
        $this->validate($request, [
            'location' => [ 'required' ]
        ]);

        $input = array_filter($request->get('books'), function($item) {
            return !empty($item['barcode']) && !empty($item['name']);
        });

        $this->getValidationFactory()->make($input, [
            '*.barcode' => [ 'required' ],
            '*.name' => [ 'required' ]
        ]);

        $location = Location::firstOrCreate([
            'name' => trim($request->get('location'))
        ]);

        foreach ($input as $item) {
            $book = Book::create([
                'location_id' => $location->id,
                'barcode' => $item['barcode'],
                'name' => $item['name']
            ]);

            $authors = [];

            foreach (Arr::get($item, 'authors') as $author) {
                $authors[] = Author::firstOrCreate([
                    'name' => $author
                ]);
            }

            $authors = array_map(function($author) { return $author->id; }, $authors);

            $book->authors()->attach($authors);

            // Lookup info from cache
            $res = $service->lookup($item['barcode']);

            if (!empty($res)) {
                if ($thumbnail = data_get('images.thumbnail', $res)) {
                    $file = $this->downloadFile($thumbnail);

                    $book->attach('thumbnail', $file);
                }
            }
        }
    }

    /**
     * Download a file and return the local temp path.
     *
     * @param $url
     * @return string|null
     */
    private function downloadFile($url) {
        $client = new Client();

        $path = tempnam(storage_path('app/temp'), 'image');

        $res = $client->get($url, [
            'sink' => $path
        ]);

        if ($res->getStatusCode() != 200) {
            return null;
        }

        return $path;
    }
}
