<?php

namespace App\Http\Controllers;

use App\Services\PayjpPlatformService;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Http\Resources\UserPaymentHistoryResource;
use App\UserPaymentHistory;
use App\Laravue\Models\User;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Validator;

class PaymentController extends Controller
{
    const ITEM_PER_PAGE = 20;
    private $_user;

    public function __construct()
    {
        $this->_user = auth('api')->user();
    }

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = UserPaymentHistory::where('user_id', $this->_user->id)->orderBy('id', 'DESC');

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

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'bank_name'           => [ 'required' ],
            'bank_code'           => [ 'required' ],
            'bank_branch_name'    => [ 'required' ],
            'bank_branch_code'    => [ 'required' ],
            'bank_account_type'   => [ 'required' ],
            'bank_account_number' => [ 'required' ],
            'bank_holder_name'    => [ 'required' ],
        ]);
        if ($validator->fails()) return response()->json([ 'errors' => $validator->errors() ], 403);

        $params = $request->all();

        // PAY.JP Platform 連携の検証が通った場合のみ口座情報を保存する。
        // 先に保存してしまうと、PAY.JP 検証に失敗してもマイページ上は「登録済み」に
        // 見えてしまい、実際には有効なテナント（振込先）が無いという不整合が起きるため、
        // 保存と PAY.JP 連携を同一トランザクションで実行し、失敗時はロールバックする。
        try {
            DB::transaction(function () use ($params) {
                User::where('id', $this->_user->id)->update([
                    'bank_name'           => $params['bank_name'],
                    'bank_code'           => $params['bank_code'],
                    'bank_branch_name'    => $params['bank_branch_name'],
                    'bank_branch_code'    => $params['bank_branch_code'],
                    'bank_account_type'   => ($params['bank_account_type'] == 1) ? 1 : 0,
                    'bank_account_number' => $params['bank_account_number'],
                    'bank_holder_name'    => $params['bank_holder_name'],
                ]);

                // PAY.JP Platform 連携:
                // - テナント未登録 → 新規作成（自動振込モードを有効化）
                // - テナント登録済み → 口座情報を更新してバリデーション
                $user = User::find($this->_user->id);
                if ($user && config('payjp.secret_key')) {
                    $platformService = new PayjpPlatformService();
                    if ($user->payjp_tenant_id) {
                        $platformService->updateTenant($user);
                    } else {
                        $platformService->createTenant($user);
                    }
                }
            });
        } catch (\Exception $e) {
            Log::error("PaymentController: PAY.JPテナント連携失敗 user_id={$this->_user->id}, error={$e->getMessage()}");

            // 検証失敗時は口座情報も保存されない（ロールバック済み）
            $errorMessage = '口座情報の検証に失敗しました。金融機関コード・支店コードが正しいかご確認ください。';
            return response()->json(['errors' => $errorMessage], 422);
        }

        return response()->json(null, 204);
    }
}
