<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Newspaper;
use App\Models\NewspaperPage;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;

class PageController extends Controller
{
    public function store(Request $request, Newspaper $newspaper)
    {
        $request->validate([
            'images' => 'required|array|min:1',
            'images.*' => 'required|image|mimes:jpg,jpeg,png,webp|max:20480',
        ]);

        $startOrder = $newspaper->pages()->max('sort_order') ?? 0;
        $pageNumber = $newspaper->pages()->max('page_number') ?? 0;

        foreach ($request->file('images') as $index => $file) {
            $pageNumber++;
            $startOrder++;

            $dir = 'newspapers/' . $newspaper->publish_date->format('Y-m-d');

            $filename = 'page_' . $pageNumber . '_' . uniqid() . '.' . $file->getClientOriginalExtension();
            $path = $file->storeAs($dir, $filename, 'public');

            $thumbFilename = 'thumb_' . $filename;
            $thumbPath = $dir . '/' . $thumbFilename;

            try {
                $img = Image::make($file)->resize(300, null, function ($c) {
                    $c->aspectRatio();
                    $c->upsize();
                });
                Storage::disk('public')->put($thumbPath, (string) $img->encode());
            } catch (\Exception $e) {
                $thumbPath = null;
            }

            NewspaperPage::create([
                'newspaper_id' => $newspaper->id,
                'page_number' => $pageNumber,
                'title' => $request->input("titles.{$index}"),
                'image_path' => $path,
                'thumbnail_path' => $thumbPath,
                'sort_order' => $startOrder,
            ]);
        }

        return redirect()->route('admin.newspapers.pages', $newspaper)
            ->with('success', count($request->file('images')) . ' page(s) uploaded successfully.');
    }

    public function destroy(NewspaperPage $page)
    {
        $newspaper = $page->newspaper;

        if (Storage::disk('public')->exists($page->image_path)) {
            Storage::disk('public')->delete($page->image_path);
        }
        if ($page->thumbnail_path && Storage::disk('public')->exists($page->thumbnail_path)) {
            Storage::disk('public')->delete($page->thumbnail_path);
        }

        $page->delete();

        return redirect()->route('admin.newspapers.pages', $newspaper)
            ->with('success', 'Page deleted.');
    }

    public function reorder(Request $request)
    {
        $request->validate(['pages' => 'required|array']);

        foreach ($request->pages as $order => $pageId) {
            NewspaperPage::where('id', $pageId)->update(['sort_order' => $order + 1]);
        }

        return response()->json(['success' => true]);
    }

    public function update(Request $request, NewspaperPage $page)
    {
        $data = $request->validate([
            'title' => 'nullable|string|max:255',
            'page_number' => 'required|integer|min:1',
        ]);

        $page->update($data);

        return redirect()->route('admin.newspapers.pages', $page->newspaper)
            ->with('success', 'Page updated.');
    }
}
