<?php

namespace App\Http\Controllers;

use App\Models\MatchGame;
use App\Models\Game;
use Illuminate\Http\Request;
use App\Http\Requests\StoreMatchRequest;
use Illuminate\Support\Facades\Auth;

class MatchController extends Controller
{
    public function index(Request $request)
    {
        $query = MatchGame::query()->with(['winner', 'player1', 'player2']);

        if ($request->has('type')) {
            $query->where('type', $request->type);
        }

        if ($request->has('status')) {
            $query->where('status', $request->status);
        }

        $query->orderBy('began_at', 'desc');

        return response()->json($query->paginate(15));
    }

    public function store(StoreMatchRequest $request)
    {
        $validated = $request->validated();
        $user = Auth::user();

        $activeMatch = MatchGame::where(function ($q) use ($user) {
            $q->where('player1_user_id', $user->id)
              ->orWhere('player2_user_id', $user->id);
        })->whereIn('status', ['Pending', 'Playing'])->exists();

        $activeGame = Game::where(function ($q) use ($user) {
            $q->where('player1_user_id', $user->id)
              ->orWhere('player2_user_id', $user->id);
        })->whereIn('status', ['Pending', 'Playing'])->exists();

        if ($activeMatch || $activeGame) {
            return response()->json(['message' => 'You already have an active game or match.'], 400);
        }

        $match = MatchGame::create([
            'type' => $validated['type'],
            'status' => 'Pending',
            'player1_user_id' => $user->id,
            'player2_user_id' => $user->id,
            'winner_user_id' => $user->id,
            'loser_user_id' => $user->id,
            'stake' => $validated['stake'],
            'began_at' => now(),
            'player1_marks' => 0,
            'player2_marks' => 0,
            'player1_points' => 0,
            'player2_points' => 0,
            'custom' => null
        ]);

        return response()->json([
            'message' => 'Match created successfully',
            'match' => $match
        ], 201);
    }

    public function show(MatchGame $match)
    {
        $match->load(['player1', 'player2', 'winner']);
        return response()->json($match);
    }

    public function join(MatchGame $match)
    {
        $user = Auth::user();

        if ($match->player1_user_id == $user->id) {
            return response()->json(['message' => 'Waiting for opponent...', 'match' => $match]);
        }

        if ($match->status !== 'Pending') {
            return response()->json(['message' => 'Match is full or started'], 400);
        }

        $activeMatch = MatchGame::where(function ($q) use ($user) {
            $q->where('player1_user_id', $user->id)
              ->orWhere('player2_user_id', $user->id);
        })->whereIn('status', ['Pending', 'Playing'])->exists();

        if ($activeMatch) {
             return response()->json(['message' => 'You are already in another active match.'], 400);
        }

        $match->update([
            'status' => 'Playing',
            'player2_user_id' => $user->id
        ]);

        return response()->json([
            'message' => 'Joined match successfully!',
            'match' => $match
        ]);
    }

    public function update(Request $request, MatchGame $match)
    {
        if ($match->status == 'Ended') {
            return response()->json(['message' => 'Match already ended'], 400);
        }

        $data = $request->validate([
            'status' => 'in:Playing,Ended,Interrupted',
            'winner_user_id' => 'exists:users,id',
            'loser_user_id' => 'exists:users,id',
            'player1_marks' => 'integer',
            'player2_marks' => 'integer',
            'player1_points' => 'integer',
            'player2_points' => 'integer',
            'total_time' => 'numeric'
        ]);

        if (isset($data['status']) && $data['status'] === 'Ended') {
            $data['ended_at'] = now();
        }

        $match->update($data);

        return response()->json($match);
    }
}