<?php

/**
 * Test script để kiểm tra auto-cancel đơn hàng sau 2 lần reject
 *
 * Run: php tests/test_auto_cancel_after_2_rejections.php
 */

require __DIR__ . '/../vendor/autoload.php';

$app = require_once __DIR__ . '/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();

use App\Laravue\Models\User;
use App\Order;
use App\Services\IdentityVerificationService;
use Illuminate\Support\Facades\DB;

echo "\n=== TEST: Auto-cancel đơn hàng sau 2 lần reject ===\n\n";

// 1. Tìm hoặc tạo user test
$testEmail = 'test_rejection_' . time() . '@test.com';
$testUser = User::create([
    'username' => $testEmail,
    'name' => 'Test User Rejection',
    'email' => $testEmail,
    'password' => bcrypt('password123'),
    'full_name' => 'Test User Rejection',
    'identity_status' => User::IDENTITY_STATUS_PENDING,
    'identity_document_type' => 'driver_license',
    'identity_submitted_at' => now(),
    'identity_rejection_count' => 0,
    'driver_license' => 'test_driver_license.jpg',
    'insurance_card' => 'test_insurance_card.jpg',
]);

echo "✓ Đã tạo user test: {$testUser->email} (ID: {$testUser->id})\n";
echo "  - Status: {$testUser->identity_status}\n";
echo "  - Rejection count: {$testUser->identity_rejection_count}\n\n";

// 2. Tạo đơn hàng provisional
$testOrder = Order::create([
    'user_id' => $testUser->id,
    'code' => 'TEST-' . strtoupper(uniqid()),
    'status' => Order::STATUS_PROVISIONAL,
    'is_provisional' => true,
    'provisional_created_at' => now(),
    'provisional_expires_at' => now()->addDays(3),
    'total_price' => 50000,
    'payment_method' => 1, // 1 = credit card
]);

echo "✓ Đã tạo đơn hàng provisional: {$testOrder->code} (ID: {$testOrder->id})\n";
echo "  - Status: {$testOrder->status}\n";
echo "  - Is provisional: " . ($testOrder->is_provisional ? 'Yes' : 'No') . "\n";
echo "  - Expires at: {$testOrder->provisional_expires_at}\n\n";

// 3. Tạo admin user
$admin = User::where('email', 'admin@admin.dev')->first();
if (!$admin) {
    echo "✗ Không tìm thấy admin user. Tạo admin mới...\n";
    $admin = User::create([
        'username' => 'admin@admin.dev',
        'name' => 'Admin User',
        'email' => 'admin@admin.dev',
        'password' => bcrypt('password123'),
        'full_name' => 'Admin User',
    ]);
}
echo "✓ Admin: {$admin->email} (ID: {$admin->id})\n\n";

// 4. Test service
$service = new IdentityVerificationService();

echo "=== Reject lần 1 ===\n";
try {
    $result1 = $service->reject($testUser, $admin, 'Hình ảnh không rõ ràng', 'Vui lòng chụp lại với ánh sáng tốt hơn');
    echo "✓ Reject lần 1 thành công:\n";
    echo "  - Message: {$result1['message']}\n";
    echo "  - Rejection count: {$result1['rejection_count']}\n";
    echo "  - Can resubmit: " . ($result1['can_resubmit'] ? 'Yes' : 'No') . "\n";

    // Kiểm tra đơn hàng
    $testOrder->refresh();
    echo "  - Order status: {$testOrder->status}\n";
    echo "  - Order auto_cancelled: " . ($testOrder->auto_cancelled ? 'Yes' : 'No') . "\n";
    echo "  - Order expires at: {$testOrder->provisional_expires_at}\n";
} catch (\Exception $e) {
    echo "✗ Reject lần 1 thất bại: {$e->getMessage()}\n";
    exit(1);
}

echo "\n";

// 5. Reset status về pending để reject lần 2
$testUser->refresh();
$testUser->update(['identity_status' => User::IDENTITY_STATUS_PENDING]);

echo "=== Reject lần 2 ===\n";
try {
    $result2 = $service->reject($testUser, $admin, 'Thông tin không khớp', 'Tên trên giấy tờ không khớp với thông tin đăng ký');
    echo "✓ Reject lần 2 thành công:\n";
    echo "  - Message: {$result2['message']}\n";
    echo "  - Rejection count: {$result2['rejection_count']}\n";
    echo "  - Can resubmit: " . ($result2['can_resubmit'] ? 'Yes' : 'No') . "\n";

    // Kiểm tra đơn hàng sau reject lần 2
    $testOrder->refresh();
    echo "  - Order status: {$testOrder->status} (Expected: " . Order::STATUS_CANCELLED . ")\n";
    echo "  - Order auto_cancelled: " . ($testOrder->auto_cancelled ? 'Yes' : 'No') . " (Expected: Yes)\n";
    echo "  - Order cancellation_reason: " . ($testOrder->cancellation_reason ?? 'N/A') . "\n";

    // Kiểm tra kết quả
    if ($testOrder->status == Order::STATUS_CANCELLED && $testOrder->auto_cancelled) {
        echo "\n✓✓✓ TEST PASSED: Đơn hàng đã được auto-cancel sau 2 lần reject! ✓✓✓\n";
    } else {
        echo "\n✗✗✗ TEST FAILED: Đơn hàng KHÔNG được auto-cancel! ✗✗✗\n";
    }
} catch (\Exception $e) {
    echo "✗ Reject lần 2 thất bại: {$e->getMessage()}\n";
    exit(1);
}

echo "\n";

// 6. Cleanup (optional - comment out nếu muốn giữ data để kiểm tra)
echo "=== Cleanup ===\n";
$testOrder->delete();
$testUser->delete();
echo "✓ Đã xóa test data\n";

echo "\n=== TEST COMPLETED ===\n\n";
