<?php

namespace App\Http\Controllers;

use App\Models\Chat;
use App\Models\Sewa;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;

class ChatController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        // Tampilkan daftar chat berdasarkan tipe_pengguna user
        if (Auth::user()->tipe_pengguna === 'admin') {
            // Untuk admin, tampilkan semua pengguna yang memiliki chat
            $users = User::where('tipe_pengguna', '!=', 'admin')
                ->withCount(['sentChats as unread_chats_count' => function($query) {
                    $query->where('is_read', false);
                }])
                ->orderBy('nama')
                ->get();

            return view('chat.index', compact('users'));
        } else {
            // Untuk user biasa, tampilkan chat dengan admin
            $adminUsers = User::where('tipe_pengguna', 'admin')
                ->get();

            return view('chat.index', compact('adminUsers'));
        }
    }

    public function show($user_id)
    {
        try {
            \Log::info('Chat Show Method - Start', [
                'user_id' => $user_id,
                'auth_user' => [
                    'id' => Auth::id(),
                    'tipe_pengguna' => Auth::user()->tipe_pengguna
                ]
            ]);

            // Cek apakah user yang diminta ada
            $chatUser = User::findOrFail($user_id);
            \Log::info('Chat User Found', [
                'chat_user' => [
                    'id' => $chatUser->id,
                    'nama' => $chatUser->nama,
                    'tipe_pengguna' => $chatUser->tipe_pengguna
                ]
            ]);
            
            // Jika user biasa mencoba mengakses chat dengan user non-admin lain, tolak
            if (Auth::user()->tipe_pengguna !== 'admin' && $chatUser->tipe_pengguna !== 'admin') {
                abort(403, 'Anda hanya dapat chat dengan admin.');
            }
            
            // Jika admin mencoba chat dengan admin lain, tolak
            if (Auth::user()->tipe_pengguna === 'admin' && $chatUser->tipe_pengguna === 'admin') {
                abort(403, 'Admin tidak dapat chat dengan admin lain.');
            }

            // Ambil riwayat chat antara kedua user
            $chats = Chat::where(function($query) use ($user_id) {
                $query->where('sender_id', Auth::id())
                    ->where('receiver_id', $user_id);
            })->orWhere(function($query) use ($user_id) {
                $query->where('sender_id', $user_id)
                    ->where('receiver_id', Auth::id());
            })->orderBy('created_at', 'asc')->get();

            \Log::info('Chats Retrieved', [
                'count' => $chats->count()
            ]);

            return view('chat.chat_view', compact('chatUser', 'chats'));

        } catch (\Exception $e) {
            \Log::error('Error in Chat Show Method', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
            
            return back()->with('error', 'Terjadi kesalahan saat membuka chat.');
        }
    }

    // Helper untuk mendapatkan atau membuat sewa untuk chat
    private function getOrCreateSewaForChat($user_id)
    {
        try {
            \Log::info('Getting or Creating Sewa for Chat', [
                'user_id' => $user_id
            ]);

            // Cari sewa terakhir dari user tersebut
            $sewa = Sewa::where('user_id', $user_id)
                ->latest()
                ->first();

            if ($sewa) {
                \Log::info('Existing Sewa Found', [
                    'sewa_id' => $sewa->id,
                    'status' => $sewa->status
                ]);
                return $sewa;
            }

            // Jika tidak ada sewa, buat sewa dummy untuk chat
            \Log::info('No existing sewa found, creating dummy sewa');
            
            // Cari paket pertama yang aktif untuk digunakan sebagai dummy
            $paket = \App\Models\Paket::where('status', 'aktif')->first();
            
            if (!$paket) {
                \Log::error('No active package found for dummy sewa');
                throw new \Exception('Tidak dapat membuat chat karena tidak ada paket yang tersedia.');
            }
            
            // Buat sewa dummy
            $sewa = Sewa::create([
                'user_id' => $user_id,
                'paket_id' => $paket->id,
                'tanggal_mulai' => now(),
                'tanggal_selesai' => now()->addDays(1),
                'lokasi' => 'Chat Admin',
                'catatan' => 'Sewa otomatis dibuat untuk keperluan chat',
                'total_harga' => 0,
                'status' => 'chat_only'
            ]);

            \Log::info('Dummy Sewa Created', [
                'sewa_id' => $sewa->id,
                'user_id' => $sewa->user_id,
                'paket_id' => $sewa->paket_id
            ]);

            return $sewa;
        } catch (\Exception $e) {
            \Log::error('Error in getOrCreateSewaForChat', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
            throw $e;
        }
    }

    public function getNewMessages(Request $request, $user_id)
    {
        try {
            // Cek apakah user yang diminta ada
            $chatUser = User::findOrFail($user_id);
            
            // Ambil sewa untuk keperluan chat
            if (Auth::user()->tipe_pengguna === 'admin') {
                $sewa = $this->getOrCreateSewaForChat($chatUser->id);
            } else {
                $sewa = $this->getOrCreateSewaForChat(Auth::id());
            }

            $messages = Chat::with('sender')
                ->where('sewa_id', $sewa->id)
                ->where('id', '>', $request->query('after', 0))
                ->orderBy('created_at', 'asc')
                ->get();

            // Tandai pesan baru sebagai sudah dibaca
            Chat::where('sewa_id', $sewa->id)
                ->where('sender_id', '!=', auth()->id())
                ->where('is_read', false)
                ->update(['is_read' => true]);

            return response()->json([
                'messages' => $messages
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }

    public function store(Request $request, $user_id)
    {
        try {
            \Log::info('Chat Store Method - Start', [
                'user_id' => $user_id,
                'message' => $request->message
            ]);

            $request->validate([
                'message' => 'required|string'
            ]);

            // Cek apakah user yang diminta ada
            $receiver = User::findOrFail($user_id);
            
            // Ambil sewa untuk keperluan chat
            if (Auth::user()->tipe_pengguna === 'admin') {
                $sewa = $this->getOrCreateSewaForChat($receiver->id);
            } else {
                $sewa = $this->getOrCreateSewaForChat(Auth::id());
            }

            $chat = Chat::create([
                'sewa_id' => $sewa->id,
                'sender_id' => Auth::id(),
                'receiver_id' => $user_id,
                'message' => $request->message,
                'is_read' => false
            ]);

            \Log::info('Chat Created', [
                'chat_id' => $chat->id
            ]);

            return back()->with('success', 'Pesan terkirim');

        } catch (\Exception $e) {
            \Log::error('Error in Chat Store Method', [
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ]);
            
            return back()->with('error', 'Gagal mengirim pesan: ' . $e->getMessage());
        }
    }

    public function markAsRead($user_id)
    {
        try {
            // Cek apakah user yang diminta ada
            $chatUser = User::findOrFail($user_id);
            
            // Ambil sewa untuk keperluan chat
            if (Auth::user()->tipe_pengguna === 'admin') {
                $sewa = $this->getOrCreateSewaForChat($chatUser->id);
            } else {
                $sewa = $this->getOrCreateSewaForChat(Auth::id());
            }

            Chat::where('sewa_id', $sewa->id)
                ->where('sender_id', '!=', auth()->id())
                ->where('is_read', false)
                ->update(['is_read' => true]);

            return response()->json(['success' => true]);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Terjadi kesalahan: ' . $e->getMessage()
            ], 500);
        }
    }

    public function getUnreadCount()
    {
        $query = Chat::where('is_read', false)
            ->where('sender_id', '!=', auth()->id());

        if (auth()->user()->tipe_pengguna !== 'admin') {
            $query->whereHas('sewa', function($q) {
                $q->where('user_id', auth()->id());
            });
        }

        $unreadCount = $query->count();

        return response()->json(['count' => $unreadCount]);
    }

    // Helper untuk mendapatkan ID admin pertama (untuk chat dari user ke admin)
    public static function getFirstAdminId()
    {
        $admin = User::where('tipe_pengguna', 'admin')->first();
        return $admin ? $admin->id : 1; // Default ke ID 1 jika tidak ada admin
    }
} 