<?php

namespace App\Http\Controllers\Api\Posts;

use App\Http\Controllers\Controller;
use App\Services\Posts\PostFeedService;
use App\Services\Posts\PostHashtagService;
use App\Services\Posts\PostTrendingService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

/**
 * GET /api/feed/trending
 * GET /api/feed/hashtag/{tag}
 * GET /api/feed/hashtags/trending
 */
class PostTrendingFeedController extends Controller
{
    public function __construct(
        private PostTrendingService $trendingService,
        private PostFeedService     $feedService,
        private PostHashtagService  $hashtagService,
    ) {}

    public function trending(Request $request): JsonResponse
    {
        $page   = max(1, (int) $request->query('page', 1));
        $viewer = $request->user()?->id;

        $result = $this->trendingService->getTrending($viewer, $page);

        $formatted = array_map(
            fn ($post) => $this->feedService->formatPost($post, $viewer),
            $result['data'],
        );

        return response()->json(['data' => array_values($formatted), 'meta' => $result['meta']]);
    }

    public function hashtag(Request $request, string $tag): JsonResponse
    {
        $tag    = mb_strtolower(preg_replace('/[^A-Za-z0-9_]/', '', $tag));
        if (strlen($tag) < 2 || strlen($tag) > 64) {
            return response()->json(['message' => 'Invalid hashtag.'], 422);
        }

        $page   = max(1, (int) $request->query('page', 1));
        $viewer = $request->user()?->id;

        $result = $this->feedService->getHashtagFeed($tag, $viewer, $page);

        $formatted = array_map(
            fn ($post) => $this->feedService->formatPost($post, $viewer),
            $result['data'],
        );

        return response()->json([
            'tag'  => $tag,
            'data' => array_values($formatted),
            'meta' => $result['meta'],
        ]);
    }

    public function trendingHashtags(): JsonResponse
    {
        $tags = Cache::remember('trending_hashtags', 300, function () {
            return $this->hashtagService->trending(10, 24);
        });

        return response()->json(['hashtags' => $tags]);
    }
}
