<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Services\DeliveryAnalyticsService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;

class DeliveryAnalyticsController extends Controller
{
    public function __construct(
        protected DeliveryAnalyticsService $deliveryAnalyticsService
    ) {}

    public function index(Request $request): View
    {
        $request->merge([
            'month' => (int) $request->input('month', now()->month),
            'year' => (int) $request->input('year', now()->year),
        ]);

        $validated = $request->validate([
            'month' => ['required', 'integer', 'between:1,12'],
            'year' => ['required', 'integer', 'min:2020', 'max:2100'],
            'carrier_id' => ['nullable', 'integer', 'exists:carriers,id'],
            'per_page' => ['nullable', 'integer', 'between:10,100'],
        ]);

        $month = (int) $validated['month'];
        $year = (int) $validated['year'];
        $carrierId = isset($validated['carrier_id']) ? (int) $validated['carrier_id'] : null;
        $perPage = isset($validated['per_page']) ? (int) $validated['per_page'] : 25;

        $kpis = $this->deliveryAnalyticsService->getMonthlyKpis($month, $year, $carrierId);
        $carrierKpis = $this->deliveryAnalyticsService->getMonthlyCarrierKpis($month, $year);
        $reportRows = $this->deliveryAnalyticsService->getMonthlyReportRows($month, $year, $carrierId, $perPage);

        return view('admin.reports.delivery', compact(
            'month',
            'year',
            'carrierId',
            'kpis',
            'carrierKpis',
            'reportRows'
        ));
    }

    public function kpis(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'month' => ['required', 'integer', 'between:1,12'],
            'year' => ['required', 'integer', 'min:2020', 'max:2100'],
            'carrier_id' => ['nullable', 'integer', 'exists:carriers,id'],
        ]);

        $month = (int) $validated['month'];
        $year = (int) $validated['year'];
        $carrierId = isset($validated['carrier_id']) ? (int) $validated['carrier_id'] : null;
        $kpis = $this->deliveryAnalyticsService->getMonthlyKpis($month, $year, $carrierId);

        return response()->json([
            'filters' => [
                'month' => $month,
                'year' => $year,
                'carrier_id' => $carrierId,
            ],
            'kpis' => $kpis,
        ]);
    }

    public function exportCsv(Request $request): StreamedResponse
    {
        $validated = $request->validate([
            'month' => ['required', 'integer', 'between:1,12'],
            'year' => ['required', 'integer', 'min:2020', 'max:2100'],
            'carrier_id' => ['nullable', 'integer', 'exists:carriers,id'],
        ]);

        $month = (int) $validated['month'];
        $year = (int) $validated['year'];
        $carrierId = isset($validated['carrier_id']) ? (int) $validated['carrier_id'] : null;

        $rows = $this->deliveryAnalyticsService->getMonthlyReportRowsForExport($month, $year, $carrierId);
        $filename = sprintf('delivery_report_%04d_%02d_%s.csv', $year, $month, now()->format('His'));

        $headers = [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename="' . $filename . '"',
        ];

        $callback = static function () use ($rows): void {
            $file = fopen('php://output', 'w');
            fprintf($file, chr(0xEF) . chr(0xBB) . chr(0xBF));

            fputcsv($file, [
                'Order ID',
                'Order Number',
                'Carrier',
                'Order Date',
                'Shipment Status',
                'Order Status',
                'Order Amount',
                'Payment Type',
            ]);

            foreach ($rows as $row) {
                fputcsv($file, [
                    '#' . $row->order_id,
                    $row->order_number ?: ('ORD-' . $row->order_id),
                    $row->carrier_name ?: 'N/A',
                    $row->order_date,
                    ucfirst((string) $row->shipment_status),
                    ucfirst((string) $row->order_status),
                    number_format((float) $row->order_amount, 2, '.', ''),
                    $row->payment_method === 'cod' ? 'COD' : 'Prepaid',
                ]);
            }

            fclose($file);
        };

        return response()->stream($callback, 200, $headers);
    }
}
