<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Models\OrderCancelRequest;
use App\Services\DigiPayService;
use App\Services\TorobPayService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class OrderCancelController extends Controller
{
    public function index(Request $request)
    {
        $query = OrderCancelRequest::with(['order.user', 'user'])
            ->latest();

        if ($search = trim($request->input('q', ''))) {
            $query->where(function ($q) use ($search) {
                $q->whereHas('order', fn ($oq) => $oq->where('order_number', 'like', "%{$search}%"))
                    ->orWhereHas('user', function ($uq) use ($search) {
                        $uq->where('first_name', 'like', "%{$search}%")
                            ->orWhere('last_name', 'like', "%{$search}%")
                            ->orWhere('mobile', 'like', "%{$search}%");
                    });
            });
        }

        if ($status = $request->input('status')) {
            $query->where('status', $status);
        }

        $requests = $query->paginate(25)->withQueryString();

        $statuses = [
            'pending'  => 'در انتظار بررسی',
            'approved' => 'تأیید شده',
            'rejected' => 'رد شده',
        ];

        return view('admin.orders.returns.index', compact('requests', 'statuses'));
    }

    public function show(Order $order)
    {
        $cancelRequest = OrderCancelRequest::where('order_id', $order->id)
            ->latest()
            ->firstOrFail();

        $order->load(['items.product', 'user', 'transactions']);
        $cancelRequest->load(['user', 'reviewer']);

        return view('admin.orders.returns.show', compact('order', 'cancelRequest'));
    }

    public function decide(Request $request, Order $order)
    {
        $cancelRequest = OrderCancelRequest::where('order_id', $order->id)
            ->where('status', 'pending')
            ->latest()
            ->firstOrFail();

        $data = $request->validate([
            'decision'       => ['required', 'in:approved,rejected'],
            'admin_response' => ['required', 'string', 'min:3', 'max:2000'],
        ], [
            'decision.required'       => 'انتخاب نتیجه بررسی الزامی است.',
            'decision.in'             => 'نتیجه انتخاب‌شده معتبر نیست.',
            'admin_response.required' => 'پاسخ برای کاربر الزامی است.',
            'admin_response.min'      => 'پاسخ باید حداقل ۳ کاراکتر باشد.',
        ]);

        if ($data['decision'] === 'approved' && $order->payment_method === 'torobpay') {
            $order->load('transactions');
            $result = app(TorobPayService::class)->cancelPayment($order);
            if (!($result['success'] ?? false)) {
                return back()->with(
                    'error',
                    'تأیید لغو ممکن نیست؛ عودت در ترب‌پی ناموفق بود. ' . ($result['message'] ?? '')
                );
            }
        }

        if ($data['decision'] === 'approved' && $order->payment_method === 'digipay') {
            $order->load('transactions');
            $result = app(DigiPayService::class)->cancelPayment($order);
            if (!($result['success'] ?? false)) {
                return back()->with(
                    'error',
                    'تأیید لغو ممکن نیست؛ عودت در دیجی‌پی ناموفق بود. ' . ($result['message'] ?? '')
                );
            }
        }

        DB::transaction(function () use ($cancelRequest, $order, $data) {
            $cancelRequest->update([
                'status'         => $data['decision'],
                'admin_response' => trim($data['admin_response']),
                'reviewed_by'    => Auth::id(),
                'reviewed_at'    => now(),
            ]);

            if ($data['decision'] === 'approved') {
                $order->update(['status' => 'canceled']);
            }
        });

        $msg = $data['decision'] === 'approved'
            ? 'درخواست لغو تأیید شد و وضعیت سفارش به «لغو شده» تغییر کرد.'
            : 'درخواست لغو رد شد.';

        return redirect()
            ->route('admin.orders.returns.show', $order)
            ->with('success', $msg);
    }
}
