<?php

namespace App\Http\Controllers\Api\Site;

use App\Http\Controllers\Controller;
use App\Services\IdentityVerificationService;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class IdentityVerificationController extends Controller
{
    /**
     * @var IdentityVerificationService
     */
    protected $verificationService;

    /**
     * Constructor
     *
     * @param IdentityVerificationService $verificationService
     */
    public function __construct(IdentityVerificationService $verificationService)
    {
        $this->verificationService = $verificationService;
    }

    /**
     * Get current user's identity verification status
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function status(Request $request)
    {
        try {
            $user = Auth::user();

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

            $status = $this->verificationService->getVerificationStatus($user);

            return response()->json([
                'success' => true,
                'data' => $status,
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 500);
        }
    }

    /**
     * Submit identity documents for verification
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function submit(Request $request)
    {
        try {
            $user = Auth::user();

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

            // Validate request
            $validator = Validator::make($request->all(), [
                'document_type' => 'required|in:driver_license,my_number_card',
                'driver_license_front' => 'required_if:document_type,driver_license|image|mimes:jpeg,png,jpg|max:5120',
                'driver_license_back' => 'required_if:document_type,driver_license|image|mimes:jpeg,png,jpg|max:5120',
                'my_number_card_front' => 'required_if:document_type,my_number_card|image|mimes:jpeg,png,jpg|max:5120',
                'order_id' => 'nullable|integer|exists:orders,id',
            ], [
                'document_type.required' => '本人確認書類の種類を選択してください',
                'document_type.in' => '無効な書類種類です',
                'driver_license_front.required_if' => '運転免許証の表面画像をアップロードしてください',
                'driver_license_front.image' => '運転免許証の表面は画像ファイルである必要があります',
                'driver_license_front.mimes' => '運転免許証の表面はJPEG、PNG形式である必要があります',
                'driver_license_front.max' => '運転免許証の表面は5MB以下である必要があります',
                'driver_license_back.required_if' => '運転免許証の裏面画像をアップロードしてください',
                'driver_license_back.image' => '運転免許証の裏面は画像ファイルである必要があります',
                'driver_license_back.mimes' => '運転免許証の裏面はJPEG、PNG形式である必要があります',
                'driver_license_back.max' => '運転免許証の裏面は5MB以下である必要があります',
                'my_number_card_front.required_if' => 'マイナンバーカードの表面画像をアップロードしてください',
                'my_number_card_front.image' => 'マイナンバーカードの表面は画像ファイルである必要があります',
                'my_number_card_front.mimes' => 'マイナンバーカードの表面はJPEG、PNG形式である必要があります',
                'my_number_card_front.max' => 'マイナンバーカードの表面は5MB以下である必要があります',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Validation failed',
                    'errors' => $validator->errors(),
                ], 422);
            }

            // Check if user can submit
            if ($user->isIdentityVerified()) {
                return response()->json([
                    'success' => false,
                    'message' => '本人確認は既に完了しています',
                ], 400);
            }

            if ($user->isIdentityPending()) {
                return response()->json([
                    'success' => false,
                    'message' => '本人確認は現在審査中です',
                ], 400);
            }

            if ($user->isIdentityRejected() && !$user->canResubmitIdentity()) {
                return response()->json([
                    'success' => false,
                    'message' => '本人確認の再提出回数が上限に達しました',
                ], 400);
            }

            // Prepare files
            $files = [];
            $documentType = $request->input('document_type');

            if ($documentType === User::IDENTITY_DOC_DRIVER_LICENSE) {
                $files['driver_license_front'] = $request->file('driver_license_front');
                $files['driver_license_back'] = $request->file('driver_license_back');
            } else {
                $files['my_number_card_front'] = $request->file('my_number_card_front');
            }

            // Get order if provided
            $order = null;
            if ($request->has('order_id')) {
                $order = \App\Order::where('id', $request->input('order_id'))
                    ->where('user_id', $user->id)
                    ->first();
            }

            // Submit documents
            $result = $this->verificationService->submitDocuments(
                $user,
                $documentType,
                $files,
                $order,
                $request->ip(),
                $request->userAgent()
            );

            return response()->json([
                'success' => true,
                'message' => $result['message'],
                'data' => [
                    'status' => $result['status'],
                ],
            ]);
        } catch (\InvalidArgumentException $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 422);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 500);
        }
    }

    /**
     * Get document type options
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function documentTypes()
    {
        return response()->json([
            'success' => true,
            'data' => [
                [
                    'value' => User::IDENTITY_DOC_DRIVER_LICENSE,
                    'label' => '運転免許証',
                    'description' => '表面と裏面の両方が必要です',
                    'required_images' => ['front', 'back'],
                ],
                [
                    'value' => User::IDENTITY_DOC_MY_NUMBER_CARD,
                    'label' => 'マイナンバーカード',
                    'description' => '表面のみ必要です（裏面は不要）',
                    'required_images' => ['front'],
                ],
            ],
        ]);
    }

    /**
     * Get verification history for current user
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function history(Request $request)
    {
        try {
            $user = Auth::user();

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

            $logs = $user->identityVerificationLogs()
                ->select('id', 'action', 'status_before', 'status_after', 'document_type', 'rejection_reason', 'created_at')
                ->limit(20)
                ->get()
                ->map(function ($log) {
                    return [
                        'id' => $log->id,
                        'action' => $log->action,
                        'action_label' => $log->getActionLabel(),
                        'status_before' => $log->status_before,
                        'status_after' => $log->status_after,
                        'document_type' => $log->document_type,
                        'document_type_label' => $log->getDocumentTypeLabel(),
                        'rejection_reason' => $log->rejection_reason,
                        'created_at' => $log->created_at->format('Y-m-d H:i:s'),
                    ];
                });

            return response()->json([
                'success' => true,
                'data' => $logs,
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
            ], 500);
        }
    }
}
