<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Laravue\Models\User;
use App\OwnerReward;
use App\Traits\SendsTemplateEmail;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;
use Validator;

class OwnerRewardController 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', '');
        $transferStatus = Arr::get($searchParams, 'transfer_status', '');
        $paymentMethod = Arr::get($searchParams, 'payment_method', '');
        $createdFrom = Arr::get($searchParams, 'created_from', '');
        $createdTo = Arr::get($searchParams, 'created_to', '');
        $transferredFrom = Arr::get($searchParams, 'transferred_from', '');
        $transferredTo = Arr::get($searchParams, 'transferred_to', '');

        $list = OwnerReward::with(['owner', 'order', 'product']);

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

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

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

        if (!empty($createdFrom)) {
            $list->whereDate('created_at', '>=', $createdFrom);
        }
        if (!empty($createdTo)) {
            $list->whereDate('created_at', '<=', $createdTo);
        }
        if (!empty($transferredFrom)) {
            $list->whereNotNull('transferred_at')->whereDate('transferred_at', '>=', $transferredFrom);
        }
        if (!empty($transferredTo)) {
            $list->whereNotNull('transferred_at')->whereDate('transferred_at', '<=', $transferredTo);
        }

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

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

    /**
     * 報酬詳細
     */
    public function show($id)
    {
        $reward = OwnerReward::with(['owner', 'order', 'product'])->find($id);
        if (!$reward) {
            return response()->json(['errors' => '報酬が見つかりません'], 404);
        }

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

    /**
     * 振込済みに変更
     */
    public function markAsTransferred(Request $request, $id)
    {
        $reward = OwnerReward::find($id);
        if (!$reward) {
            return response()->json(['errors' => '報酬が見つかりません'], 404);
        }

        if ($reward->isTransferred()) {
            return response()->json(['errors' => 'すでに振込済みです'], 422);
        }

        $reward->update([
            'transfer_status' => OwnerReward::TRANSFER_COMPLETED,
            'transferred_at' => now(),
        ]);

        // 振込完了メール送信
        $this->sendTransferCompleteEmail($reward);

        return response()->json([
            'status' => 'success',
            'reward' => $reward->fresh(['owner', 'order', 'product']),
        ]);
    }

    /**
     * 複数件一括振込済み変更
     */
    public function markMultipleAsTransferred(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required|array']);
        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 403);
        }

        $ids = $request->get('ids', []);
        $updated = OwnerReward::whereIn('id', $ids)
            ->where('transfer_status', OwnerReward::TRANSFER_PENDING)
            ->update([
                'transfer_status' => OwnerReward::TRANSFER_COMPLETED,
                'transferred_at' => now(),
            ]);

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

    /**
     * オーナー別の報酬サマリー
     */
    public function ownerSummary(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);

        $summary = OwnerReward::selectRaw('
                owner_id,
                COUNT(*) as total_count,
                SUM(reward_amount) as total_reward,
                SUM(CASE WHEN transfer_status = 0 THEN reward_amount ELSE 0 END) as pending_amount,
                SUM(CASE WHEN transfer_status = 1 THEN reward_amount ELSE 0 END) as transferred_amount,
                SUM(CASE WHEN transfer_status = 0 THEN 1 ELSE 0 END) as pending_count,
                SUM(CASE WHEN transfer_status = 1 THEN 1 ELSE 0 END) as transferred_count
            ')
            ->groupBy('owner_id')
            ->with('owner')
            ->orderByRaw('SUM(CASE WHEN transfer_status = 0 THEN 1 ELSE 0 END) DESC')
            ->paginate($limit);

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

    /**
     * 振込完了メールをオーナーに送信
     */
    private function sendTransferCompleteEmail(OwnerReward $reward): void
    {
        try {
            $owner = User::find($reward->owner_id);
            if (!$owner) return;

            $product = \App\Product::find($reward->product_id);

            $this->sendTemplateEmail('email_owner_transfer_complete', $owner->email, [
                'owner_name' => $owner->full_name ?? $owner->name,
                'product_name' => $product->name ?? '',
                'reward_amount' => number_format($reward->reward_amount),
                'transferred_at' => now()->format('Y年m月d日'),
            ]);
        } catch (\Exception $e) {
            Log::warning("OwnerRewardController: 振込完了メール送信失敗 reward_id={$reward->id}, error={$e->getMessage()}");
        }
    }
}
