<?php

namespace App\Http\Controllers\Webhooks;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use App\Services\Payments\StripeWebhookService;
use Stripe\Webhook;
use Stripe\Exception\SignatureVerificationException;
use UnexpectedValueException;

/**
 * StripeWebhookController
 *
 * Handles incoming Stripe webhook events.
 * https://docs.stripe.com/webhooks
 */
class StripeWebhookController extends Controller
{
     protected $webhookService;

    public function __construct(StripeWebhookService $webhookService)
    {
        $this->webhookService = $webhookService;
    }

    /**
     * Handle the incoming webhook request from Stripe.
     *
     * https://docs.stripe.com/webhooks
     */
    public function handle(Request $request)
    {
        // ✅ Log all headers for debugging
        //Log::info('Stripe Webhook Headers', $request->headers->all());

        $payload = $request->getContent();
        $sigHeader = $request->header('Stripe-Signature');
        $webhookSecret = config('stripe.webhook_secret');

        try {
            $event = Webhook::constructEvent($payload, $sigHeader, $webhookSecret);
        } catch (UnexpectedValueException $e) {
            Log::warning('Stripe Webhook: Invalid payload', ['error' => $e->getMessage()]);
            return response('Invalid payload', 400);
        } catch (SignatureVerificationException $e) {
            Log::warning('Stripe Webhook: Invalid signature', ['error' => $e->getMessage()]);
            return response('Invalid signature', 400);
        }

        // Log event
        Log::info("StripeWebhookController - Stripe Webhook Event: {$event->type}", ['id' => $event->id]);

        switch ($event->type) {
            case 'payment_intent.succeeded':
                // $event->data->object is a Payment Intent;
                if ($event->data->object->status === 'succeeded') {
                    $this->webhookService->handlePaymentSuccess($event->data->object);
                } else {
                    $this->webhookService->handlePaymentFailure($event->data->object);
                }
                break;

            case 'payment_intent.payment_failed':
                // $event->data->object is a Payment Intent;
                $webhookService->handlePaymentFailure($event->data->object);
                break;

            case 'payment_intent.processing':
                // Optional: track intermediate state
                break;

            case 'payment_intent.requires_action':
                // Optional: log or notify frontend to prompt user if needed
                break;
            case 'account.updated':
                $this->webhookService->handleAccountUpdated($event->data->object);

            default:
                //Log::info("Unhandled Stripe event type: {$event->type}");
                break;
        }

        return response('Webhook received', 200);
    }
}
