<?php

namespace App\Http\Controllers;

use App\Models\Payment\OnlinePaymentHistory;
use App\Repos\Payment\OnlinePaymentRepo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class OnlinePaymentController extends Controller
{
    /**
     * Online pa
     *
     * @param  Request  $request  [description]
     */
    public function store(Request $request)
    {
        // Validate the order id
        $request->validate(['orderId' => ['required', 'string', 'max:50', 'exists:online_payment_histories,orderId']]);

        // Find order from history
        $paymentHistory = OnlinePaymentHistory::where('orderId', $request->orderId)->first();

        // Find related resource
        $resource = (new $paymentHistory->online_paymantable_type)->find(id: $paymentHistory->online_paymantable_id);

        if (! $resource) {
            Log::channel('halkbank_payment_check_error')
                ->error('Related resource not found', [
                    'orderId' => $request->orderId,
                    'onlinePaymentHistory_id' => $paymentHistory->id,
                    'related_resource' => [
                        'type' => $paymentHistory->online_paymantable_type,
                        'id' => $paymentHistory->online_paymantable_id,
                    ],
                ]);
        }

        $resource->load('branch');

        $response = Http::asForm()->post('https://mpi.gov.tm/payment/rest/getOrderStatus.do', [
            'language' => 'ru',
            'orderId' => $request->orderId,
            'userName' => $resource->branch->billing_username,
            'password' => $resource->branch->billing_password,
        ]);

        $payment_status = $response['depositAmount'] > 0;

        if ($payment_status) {
            $resource->update([
                'paid' => true,
            ]);

            $paymentHistory->update([
                'paymentStatus' => OnlinePaymentRepo::PAID,
            ]);
        } else {
            $paymentHistory->update([
                'paymentStatus' => OnlinePaymentRepo::FAILED,
            ]);
        }

        return view(OnlinePaymentRepo::statusView(), [
            'success' => $payment_status,
            'title' => $payment_status ? __('Payment is successful') : __('Payment has failed'),
            'pnr' => $paymentHistory->orderNumber,
            'branch_name' => $resource->branch->name,
            'price_amount' => $paymentHistory->amount,
            'return_url' => $resource->panelUrl('index'),
        ]);
    }
}
