<?php

namespace App\Services\Admin;

use App\Modules\Users\Models\User;
use App\Modules\Wallet\Models\WalletTransaction;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;

/**
 * تعديل رصيد المحفظة مع تسجيل سطر في wallet_transactions.
 */
final class AdminWalletService
{
    /**
     * @param  string  $description  وصف يظهر في لوحة الإدارة والتقارير
     */
    public function applyAdjustment(User $user, string $signedAmount, string $description): void
    {
        $delta = (float) $signedAmount;

        if ($delta === 0.0) {
            throw ValidationException::withMessages([
                'adjustment' => ['المبلغ يجب أن يكون مختلفاً عن صفر.'],
            ]);
        }

        DB::transaction(function () use ($user, $delta, $description) {
            /** @var User $locked */
            $locked = User::query()->whereKey($user->id)->lockForUpdate()->firstOrFail();

            $current = (float) $locked->wallet_balance;
            $next = round($current + $delta, 2);

            if ($next < 0) {
                throw ValidationException::withMessages([
                    'adjustment' => ['لا يمكن أن يصبح الرصيد سالباً.'],
                ]);
            }

            $type = $delta >= 0 ? 'deposit' : 'payment';
            $storedAmount = round($delta, 2);

            WalletTransaction::query()->create([
                'user_id' => $locked->id,
                'type' => $type,
                'amount' => $storedAmount,
                'reference' => 'ADM-'.now()->format('YmdHis').'-'.strtoupper(Str::random(8)),
                'description' => $description !== '' ? $description : 'تعديل يدوي من لوحة الإدارة',
                'status' => 'completed',
            ]);

            $locked->update(['wallet_balance' => (string) $next]);
        });
    }
}
