<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\ServiceRequest;
use App\Traits\SendsTemplateEmail;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Validator;

class ServiceRequestController extends Controller
{
    use SendsTemplateEmail;
    const ITEM_PER_PAGE = 50;

    /**
     * 申請一覧
     */
    public function index(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $type = Arr::get($searchParams, 'type', '');
        $status = Arr::get($searchParams, 'status', '');

        $list = ServiceRequest::with(['user', 'product']);

        if (!empty($keyword)) {
            $list->where(function ($query) use ($keyword) {
                $query->where('id', '=', $keyword)
                    ->orWhereHas('user', function ($q) use ($keyword) {
                        $q->where('name', 'LIKE', '%' . $keyword . '%')
                            ->orWhere('full_name', 'LIKE', '%' . $keyword . '%');
                    })
                    ->orWhereHas('product', function ($q) use ($keyword) {
                        $q->where('name', 'LIKE', '%' . $keyword . '%');
                    });
            });
        }

        if ($type !== '' && $type !== null) {
            $list->where('type', (int)$type);
        }

        if ($status !== '' && $status !== null) {
            $list->where('status', (int)$status);
        }

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

        return response()->json($list->paginate($limit));
    }

    /**
     * 申請詳細
     */
    public function show($id)
    {
        $request = ServiceRequest::with(['user', 'product'])->find($id);
        if (!$request) {
            return response()->json(['errors' => '申請が見つかりません'], 404);
        }

        return response()->json($request);
    }

    /**
     * ステータス変更
     */
    public function updateStatus(Request $request, $id)
    {
        $validator = Validator::make($request->all(), [
            'status' => ['required', 'integer', 'in:0,1,2,3,4'],
            'admin_note' => ['nullable', 'string', 'max:2000'],
        ]);
        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 422);
        }

        $serviceRequest = ServiceRequest::find($id);
        if (!$serviceRequest) {
            return response()->json(['errors' => '申請が見つかりません'], 404);
        }

        $updateData = [
            'status' => $request->input('status'),
        ];

        if ($request->has('admin_note')) {
            $updateData['admin_note'] = $request->input('admin_note');
        }

        if ((int)$request->input('status') === ServiceRequest::STATUS_COMPLETED) {
            $updateData['completed_at'] = now();
        }

        $serviceRequest->update($updateData);

        $newStatus = (int)$request->input('status');

        // 完了時: 申請種別に応じたメールを送信
        if ($newStatus === ServiceRequest::STATUS_COMPLETED) {
            $this->sendCompletionEmail($serviceRequest);
        }

        // 一時返却の場合: キャンセル・却下・完了時にブロックデートを解除
        if (
            (int)$serviceRequest->type === ServiceRequest::TYPE_TEMPORARY_RETURN
            && $serviceRequest->product_id
            && in_array($newStatus, [
                ServiceRequest::STATUS_COMPLETED,
                ServiceRequest::STATUS_REJECTED,
                ServiceRequest::STATUS_CANCELLED,
            ])
        ) {
            \App\ProductSchedule::where('product_id', $serviceRequest->product_id)
                ->where('note', 'LIKE', '%申請ID:' . $serviceRequest->id . '%')
                ->delete();
        }

        return response()->json([
            'status' => 'success',
            'request' => $serviceRequest->fresh(['user', 'product']),
        ]);
    }

    /**
     * 申請完了時に種別に応じたメールを送信
     */
    private function sendCompletionEmail(ServiceRequest $serviceRequest)
    {
        $user = $serviceRequest->user;
        $product = $serviceRequest->product;
        if (!$user) return;

        $productName = $product ? $product->name : '';
        $userName = $user->full_name ?? $user->name;

        try {
            switch ((int) $serviceRequest->type) {
                case ServiceRequest::TYPE_LISTING:
                    // 出品申請承認
                    $this->sendTemplateEmail('email_listing_approved', $user->email, [
                        'user_name' => $userName,
                        'product_name' => $productName,
                    ]);
                    break;
                case ServiceRequest::TYPE_LISTING_STOP:
                    // 出品停止承認
                    $storageContract = $product ? \App\StorageContract::where('product_id', $product->id)
                        ->where('status', \App\StorageContract::STATUS_ACTIVE)
                        ->latest()->first() : null;
                    $storageStartDate = $storageContract && $storageContract->storage_start_date
                        ? \Carbon\Carbon::parse($storageContract->storage_start_date)->format('Y年m月d日')
                        : '';
                    $this->sendTemplateEmail('email_listing_stopped', $user->email, [
                        'user_name' => $userName,
                        'product_name' => $productName,
                        'storage_start_date' => $storageStartDate,
                    ]);
                    break;
                case ServiceRequest::TYPE_SERVICE_STOP:
                    // 利用停止 → 返却発送通知
                    $this->sendTemplateEmail('email_return_shipped', $user->email, [
                        'user_name' => $userName,
                        'product_name' => $productName,
                    ]);
                    break;
                case ServiceRequest::TYPE_TEMPORARY_RETURN:
                    // 一時返却発送通知
                    $returnDate = $serviceRequest->return_date
                        ? \Carbon\Carbon::parse($serviceRequest->return_date)->format('Y年m月d日')
                        : '';
                    $this->sendTemplateEmail('email_temp_return_shipped', $user->email, [
                        'user_name' => $userName,
                        'product_name' => $productName,
                        'return_date' => $returnDate,
                    ]);
                    break;
            }
        } catch (\Exception $e) {
            \Illuminate\Support\Facades\Log::warning("ServiceRequest completion email failed: id={$serviceRequest->id}, error={$e->getMessage()}");
        }
    }
}
