<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\BusinessSetting;
use App\Models\DelhiveryPickup;
use App\Services\Carriers\DelhiveryCarrier;
use App\Models\Carrier;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Carbon;

class PickupRequestController extends Controller
{
    public function index(Request $request): View
    {
        $query = DelhiveryPickup::query();

        if ($request->filled('search')) {
            $search = $request->get('search');
            $query->where(function ($q) use ($search) {
                $q->where('pickup_location', 'like', "%{$search}%")
                  ->orWhere('pickup_id', 'like', "%{$search}%");
            });
        }

        if ($request->filled('pickup_date')) {
            $query->whereDate('pickup_date', $request->get('pickup_date'));
        }

        $pickups = $query
            ->orderBy('created_at', 'desc')
            ->paginate(15)
            ->withQueryString();

        return view('admin.pickup-requests.index', compact('pickups'));
    }

    public function create(): View
    {
        $pickupLocations = config('services.delhivery.pickup_name') ? [config('services.delhivery.pickup_name')] : [];
        
        return view('admin.pickup-requests.create', compact('pickupLocations'));
    }

    public function send(Request $request): RedirectResponse
    {
        // use request values or sensible defaults from config
        $pickupLocation = $request->get('pickup_location', config('services.delhivery.pickup_name'));
        $pickupDate = $request->get('pickup_date', Carbon::now()->toDateString());
        $pickupTime = $request->get('pickup_time');

        if($pickupTime === null) {
	        $baseTime = Carbon::parse($pickupDate)->isToday() ? Carbon::now()->format('H:i') : '17:00';

	        $pickupDateTime = Carbon::createFromFormat('Y-m-d H:i', $pickupDate . ' ' . $baseTime)->addHours(2);
            
            $pickupDate = $pickupDateTime->toDateString();
            $pickupTime = $pickupDateTime->format('H:i');
        }
        
        $pickupTime = strlen($pickupTime) === 5 ? $pickupTime . ':00' : $pickupTime;

        $expectedPackageCount = (int) $request->get('expected_package_count', 1);

        if (empty($pickupLocation)) {
            return response()->back()->with('error', 'Pickup location required');
        }

        // Build carrier config (same logic as in store)
        $delhivery = Carrier::where('slug', 'delhivery')->first();
        $carrierConfig = [
            'enabled'   => false,
            'api_url'   => config('services.delhivery.api_url', 'https://staging-express.delhivery.com'),
            'api_token' => config('services.delhivery.api_token', ''),
        ];
        if ($delhivery) {
            $keys = $delhivery->getDecryptedApiKeys();
            $carrierConfig = [
                'enabled'   => (bool) $delhivery->enabled,
                'api_url'   => $keys['api_url'] ?? $carrierConfig['api_url'],
                'api_token' => $keys['api_token'] ?? $carrierConfig['api_token'],
            ];
        }

        $carrier = new DelhiveryCarrier($carrierConfig);

        $result = $carrier->createPickupRequest(
            pickupLocation: $pickupLocation,
            pickupDate: $pickupDate,
            pickupTime: $pickupTime,
            expectedPackageCount: $expectedPackageCount
        );

        if ($result['success']) {

            DelhiveryPickup::create([
                'pickup_id' => $result['data']['pickup_id'] ?? null,
                'pickup_location' => $pickupLocation,
                'expected_package_count' => $expectedPackageCount,
                'pickup_date' => $result['data']['pickup_date'] ?? $pickupDate,
                'pickup_time' => $result['data']['pickup_time'] ?? $pickupTime,
                'api_pickup_response' => json_encode($result['data']),
            ]);

            return redirect()->back()->with('success', 'Created pickup request.');
        }

        return redirect()->back()->with('error', $result['message'] ?? 'Failed to create pickup request.');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'pickup_location' => 'required|string|max:255',
            'pickup_date' => 'required|date|after_or_equal:today',
            'pickup_time' => 'required|date_format:H:i',
            'expected_package_count' => 'required|integer|min:1',
        ]);

        $delhivery = Carrier::where('slug', 'delhivery')->first();

        $carrierConfig = [
            'enabled'   => false,
            'api_url'   => config('services.delhivery.api_url', 'https://staging-express.delhivery.com'),
            'api_token' => config('services.delhivery.api_token', ''),
        ];

        if ($delhivery) {
            $keys = $delhivery->getDecryptedApiKeys();

            $carrierConfig = [
                'enabled'   => (bool) $delhivery->enabled,
                'api_url'   => $keys['api_url'] ?? $carrierConfig['api_url'],
                'api_token' => $keys['api_token'] ?? $carrierConfig['api_token'],
            ];
        }

        $carrier = new DelhiveryCarrier($carrierConfig);


        // Format time to H:i:s
        $pickupTime = $validated['pickup_time'] . ':00';

        // Create pickup request via API
        $result = $carrier->createPickupRequest(
            pickupLocation: $validated['pickup_location'],
            pickupDate: $validated['pickup_date'],
            pickupTime: $pickupTime,
            expectedPackageCount: $validated['expected_package_count']
        );

        if ($result['success']) {
            // Extract pickup_id from response if available
            $pickupId = null;
            if (isset($result['data']['pickup_id'])) {
                $pickupId = $result['data']['pickup_id'];
            } elseif (isset($result['data']['pickup_request_id'])) {
                $pickupId = $result['data']['pickup_request_id'];
            }

            // Save to database
            DelhiveryPickup::create([
                'pickup_id' => $pickupId,
                'pickup_location' => $validated['pickup_location'],
                'expected_package_count' => $validated['expected_package_count'],
                'pickup_date' => $validated['pickup_date'],
                'pickup_time' => $pickupTime,
                'api_pickup_response' => json_encode($result['data']),
            ]);

            return redirect()
                ->route('admin.pickup-requests.index')
                ->with('success', 'Pickup request created successfully!');
        }

        return redirect()
            ->back()
            ->withInput()
            ->with('error', $result['message'] ?? 'Failed to create pickup request.');
    }
}

