<?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;


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 : ['raw_payload' => $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"));
            
            $result = $this->ocbc->handleCallback($cybersourceResponse);
            
            return redirect()->route('ocbc.payment.status', [
                'status' => $result['status'],
                'order_id' => $result['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()
    {
        try{
            $request = request()->all();
            $status = $request['status'] ?? null;
            $orderId = $request['order_id'] ?? null;
           
            $orderRepository = app(OrderRepository::class);
            $order = $orderId ? $orderRepository->find($orderId) : null;

            if($request['status'] == core()->getConfigData('sales.payment_methods.ocbc.payment_status.paid'))
            {
                if ($order) {

                    $cartItems = $this->cartItemRepository->where('cart_id',$order->cart_id)->get();

                    $this->log->generateLog('error', "cart details", [
                        'cart_id' => $order->cart_id,
                        'cart_items' => $cartItems
                    ], config("ocbc.order_process"));

                    //$this->productRepository->removeHolingStatus($cartItems);
                    foreach ($cartItems as $cartItem) {
                        $this->productRepository->where('id', $cartItem->product_id)->update(['holding_status'=>0]);
                    }
                    Cart::deActivateCart();
                    
                    session()->flash('order_id', $order->id);
                     return redirect()->route('yas_theme.checkout.onepage.success');
                   
                }

                //return response()->json(['redirect_url' => route('yas_theme.checkout.onepage.success'), 'message' => trans("ocbc::app.ocbc.messages.paid")], 200);
            } else {
                Cart::deActivateCart();
                
                $message = '';
                if($request['status'] == core()->getConfigData('sales.payment_methods.ocbc.payment_status.pending')) {

                    $message = trans("ocbc::app.ocbc.messages.pending");
                    session()->flash('success', $message);
                    return response()->json(['redirect_url' => route('yas_theme.checkout.onepage.success'), 'message' => $message], 200);

                } elseif($request['status'] == core()->getConfigData('sales.payment_methods.stripe.payment_status.fail')) {

                    $message = trans("stripe::app.stripe.messages.fail"); 
                    session()->flash('error', $message);  
                    return response()->json(['redirect_url' => route('yas_theme.checkout.onepage.index'), 'message' => trans("stripe::app.stripe.messages.failure")], 403);
                }

            }

        //return view('payment.status', compact('status', 'message', 'order'));
        } catch (\Throwable $th) {
            $this->log->generateLog('error', "Payment Intent In Success Error", [
                'message' => $th->getMessage(),
                'trace_string' => $th->getTraceAsString()
            ], config("ocbc.order_process"));
            return response()->json(['redirect_url' => route('yas_theme.checkout.onepage.index'), 'message' => $th->getMessage()], 403);
        }
    }
}
