<?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;

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 PAY.JP
     */
    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 = '';

        // クレジットカード決済(payment_method=0)かつ決済済(payment_status=1)なら PAY.JP で返金。
        // ※課金は PAY.JP（charge id = ch_...）で行われるため、返金も必ず PAY.JP で行う。
        //   以前は Stripe API を呼んでいたため返金が常に失敗し、顧客が課金されたまま
        //   キャンセルもできない不具合があった。
        if ($order->payment_method == 0 && $order->payment_status == 1) {
            $payment = Payment::where('order_id', $order->id)
                ->where('is_deleted', false)
                ->where('status', 1) // 決済成功済み
                ->first();

            if ($payment && $payment->code) {
                try {
                    \Payjp\Payjp::setApiKey(config('payjp.secret_key'));

                    // 全額返金
                    $charge = \Payjp\Charge::retrieve($payment->code);
                    $charge->refund();

                    $payment->amount_refunded = $payment->total;
                    $payment->status = 2; // 返金済み
                    $payment->save();

                    $order->payment_status = 2; // 返金済み

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

        \DB::transaction(function () use ($order) {
            // ステータスをキャンセル(8)へ
            $order->status = Order::STATUS_CANCELLED;
            $order->save();

            // 商品ステータスを在庫(1)へ戻す
            $orderDetails = \App\OrderDetail::where('order_id', $order->id)->get();
            foreach ($orderDetails as $detail) {
                $product = \App\Product::find($detail->product_id);
                if ($product && $product->order_status == 2) {
                    $product->update(['order_status' => 1]);
                }
            }

            // レンタルカレンダーのブロック日を解放（注文IDで厳密一致削除）
            \App\ProductSchedule::where('order_id', $order->id)->delete();
        });

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

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