<?php

namespace App\Http\Controllers;

use App\Models\Fixture;
use App\Models\League;
use App\Models\Player;
use App\Models\Post;
use App\Models\Team;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;

class SearchController extends Controller
{
    public function live(Request $request)
    {
        $q = trim((string) $request->get('q', ''));

        if (mb_strlen($q) < 2) {
            return response()->json(['ok' => true, 'query' => $q, 'groups' => [
                'teams' => [], 'leagues' => [], 'matches' => [], 'players' => [], 'articles' => [],
            ]]);
        }

        $like = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $q) . '%';

        return response()->json(['ok' => true, 'query' => $q, 'groups' => [
            'teams' => $this->teams($like),
            'leagues' => $this->leagues($like),
            'matches' => $this->matches($like),
            'players' => $this->players($like),
            'articles' => $this->articles($like),
        ]]);
    }

    private function teams(string $like)
    {
        return Team::query()->where('name', 'like', $like)->orderBy('name')->limit(5)->get()
            ->map(function ($team) {
                $name = $team->name ?: 'Team';
                return [
                    'type' => 'Team',
                    'title' => $name,
                    'subtitle' => trim(($team->country ?? '') . (!empty($team->venue_name) ? ' • ' . $team->venue_name : '')),
                    'logo' => $this->assetLogo($team->logo ?? $team->image ?? null),
                    'icon' => 'fa-solid fa-shield-halved',
                    'url' => route('clubs.show', ['slug' => $team->slug ?: Str::slug($name)]),
                ];
            })->values();
    }

    private function leagues(string $like)
    {
        return League::query()->where(function ($q) use ($like) {
                $q->where('name', 'like', $like)->orWhere('country', 'like', $like);
            })->orderBy('country')->orderBy('name')->limit(5)->get()
            ->map(function ($league) {
                $title = $league->name ?: 'League';
                $country = $league->country ?: 'World';
                return [
                    'type' => 'League',
                    'title' => $title,
                    'subtitle' => $country,
                    'logo' => $this->assetLogo($league->logo ?? null),
                    'icon' => 'fa-solid fa-trophy',
                    'url' => route('competition.show', ['id' => $league->id, 'slug' => Str::slug($country . ' ' . $title)]),
                ];
            })->values();
    }

    private function matches(string $like)
    {
        return Fixture::query()->with('league:id,name,country,logo')
            ->where(function ($q) use ($like) {
                $q->where('home_team_name', 'like', $like)->orWhere('away_team_name', 'like', $like);
            })
            ->whereNotNull('home_team_name')->whereNotNull('away_team_name')
            ->orderByRaw("CASE WHEN kickoff_utc >= NOW() THEN 0 ELSE 1 END")
            ->orderBy('kickoff_utc')->limit(6)
            ->get(['id','league_id','home_team_name','away_team_name','home_team_logo','away_team_logo','kickoff_utc','status_short','home_goals','away_goals'])
            ->map(function ($fixture) {
                $home = $fixture->home_team_name ?: 'Home';
                $away = $fixture->away_team_name ?: 'Away';
                $date = $fixture->kickoff_utc ? \Carbon\Carbon::parse($fixture->kickoff_utc)->format('d M Y H:i') : '';
                $score = in_array($fixture->status_short, ['FT','AET','PEN','1H','HT','2H','LIVE','ET'], true)
                    ? ' • ' . ($fixture->home_goals ?? '-') . '-' . ($fixture->away_goals ?? '-') : '';
                return [
                    'type' => 'Match',
                    'title' => $home . ' vs ' . $away,
                    'subtitle' => trim(($fixture->league?->name ?? 'Football') . ' • ' . $date . $score),
                    'logo' => $this->assetLogo($fixture->home_team_logo ?? null),
                    'icon' => 'fa-solid fa-futbol',
                    'url' => route('matches.show', ['slug' => Str::slug($home . '-vs-' . $away) . '-' . $fixture->id]),
                ];
            })->values();
    }

    private function players(string $like)
    {
        return Player::query()->where('name', 'like', $like)->orderBy('name')->limit(5)->get()
            ->map(function ($player) {
                $name = $player->name ?: 'Player';
                $playerId = $player->provider_id ?: ($player->external_id ?: $player->id);
                return [
                    'type' => 'Player',
                    'title' => $name,
                    'subtitle' => trim(($player->nationality ?? '') . (!empty($player->position) ? ' • ' . $player->position : '')),
                    'logo' => $this->assetLogo($player->photo ?? $player->image ?? null),
                    'icon' => 'fa-regular fa-user',
                    'url' => route('players.show', ['id' => $playerId, 'slug' => $player->slug ?: Str::slug($name)]),
                ];
            })->values();
    }

    private function articles(string $like)
    {
        $query = Post::query()->where(function ($q) use ($like) {
            $q->where('title', 'like', $like)->orWhere('slug', 'like', $like);
        });

        if (Schema::hasColumn('posts', 'is_published')) {
            $query->where('is_published', true);
        }

        return $query->latest('created_at')->limit(5)->get()
            ->map(function ($post) {
                return [
                    'type' => 'Article',
                    'title' => $post->title ?: 'Article',
                    'subtitle' => $post->created_at ? $post->created_at->format('d M Y') : 'Blog',
                    'logo' => $this->assetLogo($post->featured_image ?? $post->image ?? null),
                    'icon' => 'fa-regular fa-newspaper',
                    'url' => route('blog.show', ['slug' => $post->slug]),
                ];
            })->values();
    }

    private function assetLogo($value): ?string
    {
        $value = trim((string) ($value ?? ''));
        if ($value === '') return null;
        return Str::startsWith($value, ['http://', 'https://']) ? $value : asset(ltrim($value, '/'));
    }
}