<?php

namespace Yas\Ocbc\Http\Controllers;

use Yas\Core\Handler\Log;
use Yas\Ocbc\Payment\Ocbc;
use Webkul\Checkout\Facades\Cart;
use Yas\Ocbc\Models\Transaction;
use Webkul\Product\Repositories\ProductRepository;
use Yas\Checkout\Repositories\CartItemRepository;
use Yas\Sales\Repositories\OrderRepository;
use Illuminate\Http\Request;


class PaymentController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     *
     * @var InvoiceRepository
     */
    public function __construct(
        protected Log $log,
        protected Ocbc $ocbc,
        protected ProductRepository $productRepository,
        protected CartItemRepository $cartItemRepository,
    ) {
        //
    }

    /**
     * paymentIntent to the ocbc server.
     */
    public function paymentinitiate()
    {
        try {
           // dd("test");
            $htmlForm = $this->ocbc->initiatePayment();
            // Return the HTML form that will auto-submit to CyberSource
            return $htmlForm;
           

        } catch (\Throwable $th) {
            session()->flash('error', $th->getMessage());
            $this->log->generateLog('error', "Payment Intent Error", [
                'message' => $th->getMessage(),
                'trace_string' => $th->getTraceAsString()
            ], config("ocbc.order_process"));

            return redirect()->route('yas_theme.checkout.onepage.index');
        }
    }

     /**
     * Handles the callback/return from CyberSource after payment.
     * This route will receive POST data from CyberSource's server-to-server notification.
     * It might also receive GET/POST from the customer's browser redirect.
     * It's safer to allow POST as the primary method for callbacks from payment gateways.
     */
    public function handleOCBCCallback()
    {
        $log = new Log();
        try{
            $cybersourceResponse = request()->all();
            
            if (empty($cybersourceResponse)) {
                $rawPost = file_get_contents('php://input');
                // Try parsing as JSON if it looks like JSON, otherwise keep raw string
                $decodedJson = json_decode($rawPost, true);
                $cybersourceResponse = is_array($decodedJson) ? $decodedJson : $rawPost;
            }

            // 2. Log the data reliably (force array structure for safety)
            $this->log->generateLog('Info', "OCBC Payment Callback Received in controller:", [
                'request' => is_array($cybersourceResponse) ? $cybersourceResponse : ['data' => $cybersourceResponse]
            ], config("ocbc.order_process"));
            
            if($cybersourceResponse){
                $result = $this->ocbc->handleCallback($cybersourceResponse);

                // if($result){
                //     return redirect()->route('ocbc.payment.status', [
                //     'order_id' => $result['order_id'],
                // ]);
                // }
            
            }
            // return redirect()->route('ocbc.payment.status', [
            //     //'status' => $result['status'],
            //     'order_id' => null,
            //     // Pass other necessary data to the status page, but avoid sensitive info
            // ]);

        } catch (\Throwable $th) {
            session()->flash('error', $th->getMessage());
            $log->generateLog('error', "Payment Intent Error", [
                'message' => $th->getMessage(),
                'trace_string' => $th->getTraceAsString()
            ], config("ocbc.order_process"));

            //return redirect()->route('yas_theme.checkout.onepage.index');
        }
    }

    /**
     * Displays the payment status to the user.
     */
    public function showPaymentStatus(Request $request)
    {
        // if (! $request->isMethod('post')) {
        //     return redirect()->route('yas_theme.home.index');
        // }
        try{
            $cybersourceResponse = request()->all();
            

            if (empty($cybersourceResponse)) {
                $rawPost = file_get_contents('php://input');
                // Try parsing as JSON if it looks like JSON, otherwise keep raw string
                $decodedJson = json_decode($rawPost, true);
                $cybersourceResponse = is_array($decodedJson) ? $decodedJson : $rawPost;

                $this->log->generateLog('info', "showPaymentStatus from file_get_content", [
                    'cybersourceResponse' => $cybersourceResponse,
                ], config("ocbc.order_process"));
            }

            $this->log->generateLog('info', "showPaymentStatus", [
                    'cybersourceResponse' => $cybersourceResponse,
                ], config("ocbc.order_process"));

            if (! isset($cybersourceResponse['r'])) {
                return redirect()->route('yas_theme.home.index');
            } elseif ($cybersourceResponse['r'] == 'cancel') {
                return redirect()->route('yas_theme.customers.account.orders.index', ['pm_status' => 'cancel']);
            } elseif ($cybersourceResponse['r'] == 'success') {
                return redirect()->route('yas_theme.customers.account.orders.index', ['pm_status' => 'success']);
            }else{
                return redirect()->route('yas_theme.customers.account.orders.index', ['pm_status' => 'unknown']);
            }

        } catch (\Throwable $th) {
            echo $th->getMessage();
            session()->flash('error', $th->getMessage());
            $this->log->generateLog('error', "Payment Intent In Success Error", [
                'message' => $th->getMessage(),
                'trace_string' => $th->getTraceAsString()
            ], config("ocbc.order_process"));
            return redirect()->route('yas_theme.home.index');
        }
    }
}
