<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Http\Resources\OrderResource;
use App\Http\Resources\OrderDetailResource;
use App\Order;
use App\Payment;
use Validator;
use Stripe\Stripe;
use Stripe\Refund;

class OrderController extends Controller
{
    const ITEM_PER_PAGE = 25;

    public function index(Request $request)
    {
        $user = auth('api')->user();

        if (!$user) {
            return response()->json(['data' => [], 'meta' => ['total' => 0, 'last_page' => 1]], 200);
        }

        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $status = Arr::get($searchParams, 'status', '');
        $list = Order::select('*')->where('is_deleted', false)->where('user_id', $user->id);

        if (!empty($keyword)) {
            $list->where('code', 'LIKE', '%' . $keyword . '%');
        }

        if (!empty($status)) {
            $list->where('status', $status);
        }

        $list->orderBy('id', 'DESC');

        return OrderResource::collection($list->paginate($limit));
    }

    public function show($id = 0)
    {
        $user = auth('api')->user();

        if (!$user) {
            return response()->json(['status' => 'error', 'data' => null, 'message' => 'Unauthorized'], 401);
        }

        $order = Order::select('*')
            ->where('is_deleted', false)
            ->where('user_id', $user->id)
            ->where('id', $id)
            ->first();

        if (!isset($order)) return response()->json(['status' => 'error', 'data' => null, 'message' => __('messages.order_invalid') ], 200);

        return new OrderDetailResource($order);
    }

    /**
     * Cancel an order (user can only cancel orders with status 0 or 9)
     * If paid by credit card (payment_method = 0) and already paid (payment_status = 1), refund via Stripe
     */
    public function cancel($id)
    {
        $user = auth('api')->user();

        if (!$user) {
            return response()->json(['status' => 'error', 'message' => 'Unauthorized'], 401);
        }

        $order = Order::where('is_deleted', false)
            ->where('user_id', $user->id)
            ->where('id', $id)
            ->first();

        if (!$order) {
            return response()->json(['status' => 'error', 'message' => '注文が見つかりません。'], 404);
        }

        // Chỉ cho phép hủy đơn hàng ở trạng thái 0 (注文受付) hoặc 9 (仮予約)
        if (!in_array($order->status, [Order::STATUS_NEW, Order::STATUS_PROVISIONAL])) {
            return response()->json(['status' => 'error', 'message' => 'この注文はキャンセルできません。'], 400);
        }

        $refundMessage = '';

        // Kiểm tra nếu đã thanh toán bằng credit card → thực hiện refund
        // payment_method = 0 là Credit Card, payment_status = 1 là đã thanh toán
        if ($order->payment_method == 0 && $order->payment_status == 1) {
            // Tìm payment record để lấy charge ID
            $payment = Payment::where('order_id', $order->id)
                ->where('is_deleted', false)
                ->where('status', 1) // Đã thanh toán thành công
                ->first();

            if ($payment && $payment->code) {
                try {
                    // Set Stripe API key
                    Stripe::setApiKey(config('stripe.stripe_secret'));

                    // Thực hiện refund full amount
                    $refund = Refund::create([
                        'payment_intent' => $payment->code,
                        'reason' => 'requested_by_customer',
                    ]);

                    // Cập nhật payment record
                    $payment->amount_refunded = $payment->total;
                    $payment->status = 2; // Đã refund
                    $payment->save();

                    // Cập nhật order payment_status
                    $order->payment_status = 2; // Đã refund

                    $refundMessage = '返金処理が完了しました。';

                } catch (\Exception $e) {
                    \Log::error('Stripe refund failed for order #' . $order->id . ': ' . $e->getMessage());
                    return response()->json([
                        'status' => 'error',
                        'message' => '返金処理に失敗しました。お問い合わせください。'
                    ], 500);
                }
            }
        }

        // Cập nhật status thành cancelled (8)
        $order->status = Order::STATUS_CANCELLED;
        $order->save();

        $message = '注文がキャンセルされました。';
        if ($refundMessage) {
            $message .= $refundMessage;
        }

        return response()->json(['status' => 'success', 'message' => $message]);
    }
}
