<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Services\UsingStatusService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

/**
 * 区画別利用率状況コントローラー
 * Laravel 12対応：旧Laravel 5.7からの移行版
 * 
 * 機能：駐輪場の利用率統計表示とフィルタリング
 * URL：/using_status
 */
class UsingStatusController extends Controller
{
    /**
     * コントローラーのインスタンス作成
     * Laravel 12変更点：ミドルウェアは routes/web.php で処理するように変更
     *
     * @return void
     */
    public function __construct()
    {
        // Laravel 12: ミドルウェアは routes/web.php で処理
        // Laravel 5.7: $this->middleware('auth'); を使用していた
    }

    /**
     * 区画別利用率状況ページの表示
     * Laravel 12変更点：Request処理の最適化、エラーハンドリングの強化
     * 
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse
     */
    public function index(Request $request, UsingStatusService $service)
    {
        try {
            $parkId = $request->input('park_id'); // GET/POST どちらでも取得
            $parkList = $service->getParkList();

            // 駐輪場が選択されている場合のみ取得。「全て/空」の場合は空コレクションを返す
            $utilizationStats = collect();
            if ($parkId !== null && $parkId !== '') {
                $utilizationStats = $service->getUtilizationStats($parkId);
            }

            $totals = $service->calculateTotals($utilizationStats);
            $hasData = $utilizationStats->isNotEmpty();
            $isSearchRequest = ($request->isMethod('post') || $request->has('park_id'));
            $selectedPark = $parkList->firstWhere('park_id', $parkId);

            return view('admin.using_status.index', [
                'parkList' => $parkList,
                'utilizationStats' => $utilizationStats,
                'totals' => $totals,
                'selectedParkId' => $parkId,
                'selectedPark' => $selectedPark,
                'isSearchRequest' => $isSearchRequest,
                'hasData' => $hasData,
            ]);
        } catch (\Exception $e) {
            Log::error('区画別利用率状況ページエラー', [
                'error' => $e->getMessage(),
                'file'  => $e->getFile(),
                'line'  => $e->getLine(),
                'park_id' => $parkId ?? null,
            ]);
            return redirect()->route('using_status')
                ->with('error', 'データの取得中にエラーが発生しました。管理者にお問い合わせください。');
        }
    }

    /**
     * 駐輪場一覧の取得
     * Laravel 12変更点：プライベートメソッドでの処理分離
     * 
     * @return \Illuminate\Support\Collection
     */
    // 旧: Helper 直呼びはサービス化により撤去

    /**
     * 利用率統計データの取得
     * Laravel 12変更点：エラーハンドリングの強化
     * 
     * @param int|null $parkId 駐輪場ID
     * @return \Illuminate\Support\Collection
     */
    // 旧: Helper 直呼びはサービス化により撤去

    /**
     * 合計値の計算
     * Laravel 12変更点：計算ロジックの分離
     * 
     * @param \Illuminate\Support\Collection $stats 統計データ
     * @return array
     */
    // 旧: Helper 直呼びはサービス化により撤去

    /**
     * Ajax用API（将来拡張用）
     * Laravel 12対応：JSON APIレスポンス
     * 
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function apiGetUtilization(Request $request, UsingStatusService $service)
    {
        try {
            $parkId = $request->input('park_id');
            
            // データ取得
            $stats = $service->getUtilizationStats($parkId);
            $totals = $service->calculateTotals($stats);
            
            return response()->json([
                'success' => true,
                'data' => $stats,
                'totals' => $totals,
                'message' => 'データを正常に取得しました。'
            ]);

        } catch (\Exception $e) {
            Log::error('API利用率取得エラー', [
                'error' => $e->getMessage()
            ]);
            
            return response()->json([
                'success' => false,
                'message' => 'データの取得に失敗しました。',
                'error' => app()->isProduction() ? null : $e->getMessage()
            ], 500);
        }
    }

    /**
     * データエクスポート（将来拡張用）
     * Laravel 12対応：CSVエクスポート機能
     * 
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function exportCsv(Request $request, UsingStatusService $service, \App\Services\CsvService $csv)
    {
        try {
            $parkId = $request->input('park_id');
            $stats = $service->getUtilizationStats($parkId);

            $headers = [
                'Content-Type' => 'text/csv; charset=UTF-8',
                'Content-Disposition' => 'attachment; filename="利用率状況_' . date('Y-m-d_H-i-s') . '.csv"'
            ];

            // サービスでCSV文字列を構築
            $rows = [];
            // ヘッダー
            $rows[] = ['駐輪場', '車種', '限界収容台数', '現在収容台数', '空き', '利用率'];
            foreach ($stats as $stat) {
                $rows[] = [
                    (string) $stat->park_name,
                    (string) $stat->psection_subject,
                    (string) $stat->park_limit,
                    (string) $stat->current_count,
                    (string) $stat->available,
                    sprintf('%.1f%%', (float) $stat->usage_rate),
                ];
            }

            $csvData = $csv->buildCsvString($rows, ',');
            return response($csvData, 200, $headers);

        } catch (\Exception $e) {
            Log::error('CSVエクスポートエラー', [
                'error' => $e->getMessage()
            ]);
            
            return redirect()->route('using_status')
                ->with('error', 'CSVエクスポートに失敗しました。');
        }
    }

    /**
     * CSVデータの生成（プライベートメソッド）
     * Laravel 12変更点：文字エンコーディングの考慮
     * 
     * @param \Illuminate\Support\Collection $stats
     * @return string
     */
    // CSV 生成は CsvService に委譲（本メソッドは撤去）
}