<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Models\OtpRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Hash;
use Carbon\Carbon;

class AuthOTPController extends Controller
{
    /**
     * METODE A: Request OTP via WhatsApp
     * Mengirimkan kode 4 digit ke nomor WhatsApp pelanggan
     */
    public function requestOtp(Request $request)
    {
        $request->validate([
            'phone_number' => 'required|string',
        ]);

        // 1. Standarisasi format nomor HP
        $phoneNumber = preg_replace('/\D/', '', $request->phone_number);
        
        // Pastikan format diawali 62
        if (str_starts_with($phoneNumber, '0')) {
            $phoneNumber = '62' . substr($phoneNumber, 1);
        } elseif (str_starts_with($phoneNumber, '8')) {
            $phoneNumber = '62' . $phoneNumber;
        }

        // 2. Cari pelanggan (Hanya kolom 'phone' sesuai struktur tabel Anda)
        $customer = Customer::where('phone', $phoneNumber)->first();

        if (!$customer) {
            Log::warning("Percobaan OTP nomor tidak terdaftar: " . $phoneNumber);
            return response()->json([
                'success' => false,
                'message' => 'Nomor WhatsApp ' . $phoneNumber . ' tidak terdaftar dalam sistem P-LINK.'
            ], 404);
        }

        // PENAMBAHAN ENTERPRISE: Validasi Status Aktif Pelanggan
        // Mencegah pelanggan yang belum di-approve atau di-banned untuk menghabiskan resource WA Gateway
        if (!$customer->is_active || $customer->registration_status !== 'approved') {
            return response()->json([
                'success' => false,
                'message' => 'Akses ditolak: Akun Anda sedang dinonaktifkan atau masih dalam proses verifikasi pendaftaran oleh Admin.'
            ], 403);
        }

        // PENAMBAHAN: Spam Protection WA Gateway (Rate Limiting)
        // Mencegah user melakukan spam request OTP berulang kali yang bisa menyebabkan WA di-banned
        $lastRequest = OtpRequest::where('phone_number', $phoneNumber)
            ->where('created_at', '>=', Carbon::now()->subMinutes(1))
            ->first();

        if ($lastRequest) {
            return response()->json([
                'success' => false,
                'message' => 'Harap tunggu 1 menit sebelum meminta kode OTP baru.'
            ], 429);
        }

        // 3. Generate OTP dan Expired (5 menit)
        $otpCode = (string) rand(1000, 9999);
        $expiresAt = Carbon::now()->addMinutes(5);

        // 4. Simpan riwayat permintaan OTP
        OtpRequest::create([
            'phone_number' => $phoneNumber,
            'otp_code' => $otpCode,
            'expires_at' => $expiresAt,
            'is_used' => false,
        ]);

        // 5. Kirim data ke Node.js WA Gateway
        try {
            $waMessage = "*P-LINK DISTRIBUTION SYSTEM*\n\nKode verifikasi Anda adalah: *$otpCode*\n\nKode ini bersifat rahasia dan berlaku selama 5 menit. Mohon tidak memberikan kode ini kepada siapapun demi keamanan akun Anda.";
            
            $response = Http::asJson()->timeout(15)->post('http://localhost:3001/api/send-message', [
                'number' => $phoneNumber,
                'message' => $waMessage
            ]);

            if ($response->successful()) {
                return response()->json([
                    'success' => true,
                    'message' => 'Kode OTP berhasil dikirim ke WhatsApp Anda.'
                ], 200);
            } else {
                Log::error('WA Gateway Response Error: ' . $response->body());
                return response()->json([
                    'success' => false,
                    'message' => 'Server WhatsApp sedang sibuk. Silakan coba lagi nanti.'
                ], 500);
            }
        } catch (\Exception $e) {
            Log::error('WA Gateway Exception: ' . $e->getMessage());
            return response()->json([
                'success' => false,
                'message' => 'Koneksi ke WA Gateway terputus. Pastikan service Node.js sudah berjalan.'
            ], 500);
        }
    }

    /**
     * METODE A: Verifikasi Kode OTP
     * Memvalidasi kode yang dimasukkan user dan memberikan token akses
     */
    public function verifyOtp(Request $request)
    {
        $request->validate([
            'phone_number' => 'required|string',
            'otp_code' => 'required|string'
        ]);

        $phoneNumber = preg_replace('/\D/', '', $request->phone_number);
        if (str_starts_with($phoneNumber, '0')) {
            $phoneNumber = '62' . substr($phoneNumber, 1);
        } elseif (str_starts_with($phoneNumber, '8')) {
            $phoneNumber = '62' . $phoneNumber;
        }

        // Cari OTP terbaru yang belum terpakai
        $otpRequest = OtpRequest::where('phone_number', $phoneNumber)
                                ->where('is_used', false)
                                ->latest()
                                ->first();

        if (!$otpRequest) {
            return response()->json([
                'success' => false,
                'message' => 'Sesi OTP tidak ditemukan. Silakan minta kode baru.'
            ], 404);
        }

        if ($otpRequest->otp_code !== $request->otp_code) {
            return response()->json([
                'success' => false,
                'message' => 'Kode OTP yang Anda masukkan salah.'
            ], 400);
        }

        if (Carbon::now()->greaterThan($otpRequest->expires_at)) {
            return response()->json([
                'success' => false,
                'message' => 'Kode OTP sudah kedaluwarsa. Silakan minta kode baru.'
            ], 400);
        }

        // Tandai OTP sudah digunakan
        $otpRequest->update(['is_used' => true]);

        // Ambil data pelanggan
        $customer = Customer::where('phone', $phoneNumber)->first();

        if (!$customer) {
            return response()->json([
                'success' => false,
                'message' => 'Data pelanggan tidak ditemukan.'
            ], 404);
        }
        
        // PENAMBAHAN ENTERPRISE: Lapis kedua verifikasi status akun
        if (!$customer->is_active || $customer->registration_status !== 'approved') {
            return response()->json([
                'success' => false,
                'message' => 'Akses ditolak: Akun Anda sedang dinonaktifkan atau belum disetujui.'
            ], 403);
        }

        // Terbitkan Token Sanctum
        $token = $customer->createToken('pwa-token')->plainTextToken;

        return response()->json([
            'success' => true,
            'message' => 'Autentikasi berhasil.',
            'data' => [
                'token' => $token,
                'customer' => $customer
            ]
        ], 200);
    }

    /**
     * METODE B: Login dengan Password
     * Digunakan sebagai fallback jika WhatsApp Gateway sedang terkendala
     */
    public function loginPassword(Request $request)
    {
        $request->validate([
            'phone_number' => 'required',
            'password' => 'required'
        ]);

        // 1. STANDARISASI FORMAT NOMOR
        // Hapus semua karakter selain angka (berjaga-jaga jika ada spasi atau simbol)
        $phone = preg_replace('/[^0-9]/', '', $request->phone_number);
        
        // Buat 3 variasi nomor untuk pencocokan database yang lebih aman
        $phoneVariations = [
            $phone,                     // Contoh: 816664477
            '0' . $phone,               // Contoh: 0816664477
            '62' . ltrim($phone, '0')   // Contoh: 62816664477
        ];

        // =======================================================
        // SKENARIO 1: CEK SEBAGAI PELANGGAN (TABEL CUSTOMERS)
        // =======================================================
        $customer = \App\Models\Customer::whereIn('phone', $phoneVariations)->first();

        if ($customer) {
            // PENAMBAHAN ENTERPRISE: Validasi Status Aktif Pelanggan
            if (!$customer->is_active || $customer->registration_status !== 'approved') {
                return response()->json([
                    'success' => false,
                    'message' => 'Akses ditolak: Akun Anda belum disetujui oleh Admin atau sedang dinonaktifkan.'
                ], 403);
            }

            // PENAMBAHAN: Kunci Celah Keamanan (Bypass Login)
            // Pelanggan harus diverifikasi passwordnya, tidak boleh otomatis masuk
            if (!$customer->password || !\Illuminate\Support\Facades\Hash::check($request->password, $customer->password)) {
                return response()->json([
                    'success' => false, 
                    'message' => 'Autentikasi Gagal: Password pelanggan salah atau belum diatur.'
                ], 401);
            }
            
            $token = $customer->createToken('auth_token')->plainTextToken;
            
            return response()->json([
                'success' => true,
                'data' => [
                    'token' => $token,
                    'customer' => $customer
                ]
            ]);
        }

        // =======================================================
        // SKENARIO 2: CEK SEBAGAI KURIR (TABEL USERS)
        // =======================================================
        $driver = \App\Models\User::whereIn('whatsapp', $phoneVariations)->first();

        // Verifikasi password hashing bawaan Laravel untuk User
        if ($driver && \Illuminate\Support\Facades\Hash::check($request->password, $driver->password)) {
            
            // Proteksi: Pastikan yang login hanya yang jabatannya 'driver'
            if ($driver->role !== 'driver') {
                return response()->json([
                    'success' => false, 
                    'message' => 'Akses ditolak. Akun ini tidak memiliki otorisasi Kurir Ekspedisi.'
                ]);
            }

            // PENAMBAHAN: Validasi Status Aktif Kurir
            if (isset($driver->is_active) && !$driver->is_active) {
                return response()->json([
                    'success' => false, 
                    'message' => 'Akun Kurir Anda telah dinonaktifkan. Silakan hubungi Administrator.'
                ], 403);
            }

            // Buat token Sanctum
            $token = $driver->createToken('driver_token')->plainTextToken;
            
            // PENAMBAHAN ENTERPRISE: Injeksi branch_id untuk Isolasi Data Aplikasi Kurir
            // Format ulang data agar dibaca persis seperti "customer" oleh PWA, ditambah ID Cabang
            $formattedDriverData = [
                'id' => $driver->id,
                'name' => $driver->name,
                'phone' => $driver->whatsapp,
                'level_id' => 'Driver/Kurir', // Label khusus untuk UI Profil PWA
                'role' => $driver->role,
                'branch_id' => $driver->branch_id // Wajib untuk routing POD PWA
            ];

            return response()->json([
                'success' => true,
                'data' => [
                    'token' => $token,
                    'customer' => $formattedDriverData
                ]
            ]);
        }

        // =======================================================
        // SKENARIO 3: GAGAL LOGIN
        // =======================================================
        return response()->json([
            'success' => false, 
            'message' => 'Nomor WhatsApp tidak terdaftar atau Password salah.'
        ]);
    }
}