<?php

namespace App\Http\Controllers\Legacy;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use App\Services\ArtworkService;
use App\Services\ContentTypes\ContentTypeSlugResolver;

class PhotographyController extends Controller
{
    protected ArtworkService $artworks;

    public function __construct(
        ArtworkService $artworks,
        private readonly ContentTypeSlugResolver $contentTypeResolver,
    )
    {
        $this->artworks = $artworks;
    }

    public function index(Request $request)
    {
            $segment = strtolower($request->segment(1) ?? 'photography');
            $resolution = $this->contentTypeResolver->resolve($segment);

            if (! $resolution->found() || $resolution->contentType === null) {
                abort(404);
            }

            $contentType = $resolution->contentType;
            $contentSlug = strtolower((string) $contentType->slug);

            if ($resolution->requiresRedirect()) {
                $target = url('/' . $contentSlug);

                if ($request->getQueryString()) {
                    $target .= '?' . $request->getQueryString();
                }

                return redirect()->to($target, 301);
            }

            $id = null;
            if ($contentSlug === 'photography') {
                $id = 3;
            }

            // Fetch legacy category info if available (only when we have an id)
            $category = null;
            try {
                if ($id !== null && Schema::hasTable('artworks_categories')) {
                    $category = DB::table('artworks_categories')
                        ->select('category_name', 'rootid', 'section_id', 'description', 'category_id')
                        ->where('category_id', $id)
                        ->first();
                }
            } catch (\Throwable $e) {
                $category = null;
            }

            $page_title = $category->category_name ?? ($contentType->name ?? ucfirst($contentSlug));
            $tidy = $category->description ?? ($contentType->description ?? null);

            $perPage = 40;
            $sort = (string) $request->get('sort', 'latest');

            try {
                $artworks = $this->artworks->getArtworksByContentType($contentSlug, $perPage, $sort);
            } catch (\Throwable $e) {
                $artworks = new \Illuminate\Pagination\LengthAwarePaginator([], 0, $perPage, 1, [
                    'path' => url()->current(),
                ]);
            }

            $subcategories = collect();
            try {
                if ($id !== null && Schema::hasTable('artworks_categories')) {
                    $subcategories = DB::table('artworks_categories')->select('category_id','category_name')->where('rootid', $id)->orderBy('category_name')->get();
                    if ($subcategories->count() == 0 && !empty($category->rootid)) {
                        $subcategories = DB::table('artworks_categories')->select('category_id','category_name')->where('rootid', $category->rootid)->orderBy('category_name')->get();
                    }
                }
            } catch (\Throwable $e) {
                $subcategories = collect();
            }

            if (! $subcategories || $subcategories->count() === 0) {
                $subcategories = $contentType->rootCategories()
                    ->orderBy('sort_order')
                    ->orderBy('name')
                    ->get()
                    ->map(fn ($c) => (object) ['category_id' => $c->id, 'category_name' => $c->name, 'slug' => $c->slug]);
            }

            if ($artworks instanceof \Illuminate\Database\Eloquent\Collection || $artworks instanceof \Illuminate\Support\Collection) {
                $page = (int) ($request->query('page', 1));
                $artworks = new \Illuminate\Pagination\LengthAwarePaginator($artworks->values()->all(), $artworks->count(), $perPage, $page, [
                    'path' => url()->current(),
                    'query' => request()->query(),
                ]);
            }

            $rootCategories = $contentType->rootCategories()->orderBy('sort_order')->orderBy('name')->get();

            $page_meta_description = $tidy;

            return view('legacy::content-type', compact('contentType','rootCategories','artworks','page_title','page_meta_description','subcategories','id'));
    }
}
