<?php

declare(strict_types=1);

namespace App\Services\Billing;

use App\Models\PaymentGateway;
use App\Models\SaasTransaction;
use App\Models\User;
use App\Services\Billing\Gateway\CreatePaymentResult;
use App\Services\Billing\Gateway\PaymentGatewayDriver;
use Illuminate\Support\Str;

/**
 * Оркестрация онлайн-пополнения: создаёт строку saas_transactions(pending) и
 * платёж в шлюзе. Зачисление баланса — позже, в PaymentWebhookController после
 * server-to-server сверки. Знает о шлюзе только через интерфейс драйвера.
 */
final class OnlineTopupService
{
    public function __construct(private readonly PaymentGatewayDriver $driver) {}

    public function start(
        int $tenantId,
        string $amountRub,
        PaymentGateway $gateway,
        string $returnUrl,
        ?int $userId,
    ): CreatePaymentResult {
        $idempotenceKey = (string) Str::uuid();

        $tx = SaasTransaction::create([
            'tenant_id' => $tenantId,
            'type' => SaasTransaction::TYPE_TOPUP,
            'amount_rub' => $amountRub,
            'gateway_id' => $gateway->id,
            'gateway_code' => $gateway->code,
            'gateway_idempotence_key' => $idempotenceKey,
            'legal_entity_id' => $gateway->legal_entity_id,
            'status' => SaasTransaction::STATUS_PENDING,
            'description' => 'Онлайн-пополнение баланса',
            'created_at' => now(),
        ]);

        // Чек 54-ФЗ обязателен на стороне магазина ЮKassa (фискализация включена) —
        // без секции receipt платёж отклоняется 400 "Receipt is missing". Формируем
        // всегда. vat_code=1 = «без НДС» (ИП на УСН; проверено живым запросом 26.06.2026).
        $email = $userId !== null ? User::query()->whereKey($userId)->value('email') : null;
        $email = is_string($email) && $email !== '' ? $email : (string) config('mail.from.address', 'info@liderra.ru');

        $receipt = [
            'customer' => ['email' => $email],
            'items' => [[
                'description' => 'Пополнение баланса Лидерра',
                'quantity' => '1.00',
                'amount' => ['value' => $amountRub, 'currency' => 'RUB'],
                'vat_code' => 1,
                'payment_mode' => 'full_prepayment',
                'payment_subject' => 'service',
            ]],
        ];

        $result = $this->driver->createPayment($gateway, $amountRub, $idempotenceKey, $returnUrl, $receipt);

        $tx->gateway_payment_id = $result->gatewayPaymentId;
        $tx->save();

        return $result;
    }
}
