<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Zone;
use Illuminate\Support\Facades\DB;

class ZoneController extends Controller
{
    /**
     * 一覧表示（絞り込み対応）
     */
    public function list(Request $request)
    {
        if ($request->input('action') === 'reset') {
            return redirect()->route('zones');
        }

        // ソート設定
        $sort = $request->input('sort', 'zone_id');
        $sort_type = $request->input('sort_type', 'desc');

        // ベースクエリ
        $query = Zone::query();

        // === 絞り込み条件 ===
        if ($request->filled('zone_id')) {
            $query->where('zone_id', $request->zone_id);
        }
        if ($request->filled('zone_name')) {
            $query->where('zone_name', 'LIKE', "%{$request->zone_name}%");
        }
        if ($request->filled('park_id')) {
            $query->where('park_id', $request->park_id);
        }
        if ($request->filled('ptype_id')) {
            $query->where('ptype_id', $request->ptype_id);
        }
        if ($request->filled('psection_id')) {
            $query->where('psection_id', $request->psection_id);
        }
        if ($request->has('use_flag') && $request->use_flag !== '') {
            $query->where('use_flag', $request->use_flag);
        }

        // ページネーション
        $zones = $query->orderBy($sort, $sort_type)->paginate(20);

        // === 下拉选单用の一覧データ ===
        $parkList = DB::table('park')->pluck('park_name', 'park_id');
        $ptypeList = DB::table('ptype')->pluck('ptype_id', 'ptype_id'); // 暂时显示 ID
        $psectionList = DB::table('psection')->pluck('psection_id', 'psection_id'); // 暂时显示 ID

        return view('admin.zones.list', compact(
            'zones', 'sort', 'sort_type',
            'parkList', 'ptypeList', 'psectionList'
        ));
    }


    /**
     * 新規登録
     */
    public function add(Request $request)
    {
        if ($request->isMethod('post')) {
            $data = $this->validateZone($request);
            Zone::create($data);

            return redirect()->route('zones')
                ->with('success', 'ゾーンを登録しました');
        }

        $zone = new Zone();
        return view('admin.zones.add', compact('zone'));
    }

    /**
     * 編集
     */
    public function edit($id, Request $request)
    {
        $zone = Zone::findOrFail($id);

        if ($request->isMethod('post')) {
            $data = $this->validateZone($request);
            $zone->update($data);

            return redirect()->route('zones')
                ->with('success', 'ゾーンを更新しました');
        }

        return view('admin.zones.edit', compact('zone'));
    }

    /**
     * 詳細表示
     */
    public function info($id)
    {
        $zone = Zone::findOrFail($id);

        return view('admin.zones.info', compact('zone'));
    }

    /**
     * 削除
     */
    public function delete(Request $request)
    {
        $id = $request->input('id');
        if ($id) {
            Zone::destroy($id);
            return redirect()->route('zones')->with('success', 'ゾーンを削除しました');
        }
        return redirect()->route('zones')->with('error', '削除対象が指定されていません');
    }

    /**
     * バリデーション共通化
     */
    private function validateZone(Request $request)
    {
        return $request->validate([
            'zone_name'      => 'required|string|max:50',
            'park_id'        => 'required|integer',
            'ptype_id'       => 'nullable|integer',
            'psection_id'    => 'nullable|integer',
            'zone_number'    => 'nullable|integer|min:0',
            'zone_standard'  => 'nullable|integer|min:0',
            'zone_tolerance' => 'nullable|integer|min:0',
            'use_flag'       => 'nullable|boolean',
            'memo'           => 'nullable|string|max:255',
        ]);
    }
}
