<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use App\Services\ThumbnailPresenter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;

class StatisticsController extends Controller
{
    public function index(Request $request): View
    {
        $userId = $request->user()->id;

        $sort = (string) $request->query('sort', 'date');
        $allowed = ['date', 'name', 'dls', 'category', 'comments'];
        if (! in_array($sort, $allowed, true)) {
            $sort = 'date';
        }

        $categorySub = DB::table('artwork_category as ac')
            ->join('categories as c', 'ac.category_id', '=', 'c.id')
            ->select('ac.artwork_id', DB::raw('MIN(c.name) as category_name'))
            ->groupBy('ac.artwork_id');

        $query = DB::table('artworks as a')
            ->leftJoinSub($categorySub, 'cat', function ($join) {
                $join->on('a.id', '=', 'cat.artwork_id');
            })
            ->where('a.user_id', $userId)
            ->select([
                'a.*',
                DB::raw('cat.category_name as category_name'),
            ])
            ->selectRaw('(SELECT COUNT(*) FROM artwork_comments WHERE artwork_id = a.id) AS num_comments');

        if ($sort === 'name') {
            $query->orderBy('a.name', 'asc');
        } elseif ($sort === 'dls') {
            $query->orderByDesc('a.dls');
        } elseif ($sort === 'category') {
            $query->orderBy('cat.category_name', 'asc');
        } elseif ($sort === 'comments') {
            $query->orderByDesc('num_comments');
        } else {
            $query->orderByDesc('a.published_at')->orderByDesc('a.id');
        }

        $artworks = $query->paginate(20)->appends(['sort' => $sort]);

        $artworks->getCollection()->transform(function ($row) {
            $thumb = ThumbnailPresenter::present($row, 'sm');
            $row->thumb_url = $thumb['url'] ?? '';
            $row->thumb_srcset = $thumb['srcset'] ?? null;
            return $row;
        });

        return view('user.statistics', [
            'artworks' => $artworks,
            'sort' => $sort,
            'page_title' => 'Artwork Statistics',
        ]);
    }
}
