<?php

namespace App\Http\Controllers\Admin;

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

class SettingController extends Controller
{
    /**
     * 一覧（絞り込みなし・ページングのみ）: /settings
     */
    public function list(Request $request)
    {
        $perPage = \App\Utils::item_per_page ?? 20;

        // リクエストから取得
        $sort = $request->input('sort', 'setting_id');
        $sort_type = $request->input('sort_type', 'asc');

        // 許可されたカラムのみソート（安全対策）
        $allowedSorts = ['setting_id', 'setting_key', 'setting_value']; // ← 必要に応じて増やす

        if (!in_array($sort, $allowedSorts)) {
            $sort = 'setting_id';
        }
        if (!in_array($sort_type, ['asc', 'desc'])) {
            $sort_type = 'desc';
        }

        $list = Setting::orderBy($sort, $sort_type)->paginate($perPage);

        return view('admin.settings.list', [
            'list'      => $list,
            'sort'      => $sort,
            'sort_type' => $sort_type,
        ]);
    }


    /**
     * 新規追加（GET/POST）: /settings/add
     */
    public function add(Request $request)
    {
        if ($request->isMethod('post')) {
            $v = Validator::make($request->all(), $this->rules());
            if ($v->fails()) {
                return back()->withErrors($v)->withInput();
            }

            // チェックボックス（未送信時は false）
            $data = $this->onlyFillable($request);
            $data['printable_alert_flag'] = $request->boolean('printable_alert_flag');

            DB::transaction(function () use ($data) {
                Setting::create($data);
            });

            return redirect()->route('settings')->with('success', '設定を登録しました。');
        }

        // GET時：空フォーム表示
        return view('admin.settings.add', [
            'setting' => new Setting(), // フォーム初期化用
            'isEdit'  => false,
        ]);
    }

    /**
     * 編集（GET/POST）: /settings/edit/{id}
     */
    public function edit(Request $request, int $id)
    {
        $setting = Setting::findOrFail($id);

        if ($request->isMethod('post')) {
            $v = Validator::make($request->all(), $this->rules($id));
            if ($v->fails()) {
                return back()->withErrors($v)->withInput();
            }

            $data = $this->onlyFillable($request);
            $data['printable_alert_flag'] = $request->boolean('printable_alert_flag');

            DB::transaction(function () use ($setting, $data) {
                $setting->update($data);
            });

            return redirect()->route('settings')->with('success', '設定を更新しました。');
        }

        // GET時：編集フォーム表示
        return view('admin.settings.edit', [
            'setting' => $setting,
            'isEdit'  => true,
        ]);
    }


    /**
     * 詳細表示: /settings/info/{id}
     */
    public function info(int $id)
    {
        $setting = Setting::findOrFail($id);

        return view('admin.settings.info', [
            'setting' => $setting,
            'isInfo'  => true,
            'isEdit'  => false,
        ]);
    }

    /**
     * 削除（一覧／編集 共通対応）: /settings/delete または /settings/delete/{id}
     */
    public function delete(Request $request, $id = null)
    {
        // 一覧画面（checkbox で複数削除）
        $ids = $request->input('ids');

        // 編集画面（単体削除）
        if ($id) {
            $ids = [$id];
        }

        // 削除対象が空
        if (empty($ids)) {
            return redirect()->route('settings')->with('error', '削除対象が選択されていません。');
        }

        // 削除処理
        Setting::destroy($ids);

        return redirect()->route('settings')->with('success', '設定を削除しました。');
    }


    // ===== バリデーション・ユーティリティ =====

    /**
     * バリデーションルール
     */
    private function rules(?int $id = null): array
    {
        return [
            'edit_master'             => ['nullable','string','max:255'],
            'web_master'              => ['nullable','string','max:255'],
            'auto_change_date'        => ['nullable','date'],
            'auto_chage_master'       => ['nullable','string','max:255'], // ※カラム名は仕様通り
            're-issue_alert_number'   => ['nullable','integer','min:0'],
            'image_base_url1'         => ['nullable','string','max:255'],
            'image_base_url2'         => ['nullable','string','max:255'],
            'printable_alert_flag'    => ['nullable','boolean'],
            'printable_number'        => ['nullable','integer','min:0'],
            'printable_alert_number'  => ['nullable','integer','min:0'],
            'printer_keep_alive'      => ['nullable','integer','min:0'],
            'operator_id'             => ['nullable','integer','min:0'],
        ];
    }

    /**
     * フォームから fillable のみ抽出
     */
    private function onlyFillable(Request $request): array
    {
        return $request->only([
            'edit_master',
            'web_master',
            'auto_change_date',
            'auto_chage_master',
            're-issue_alert_number',
            'image_base_url1',
            'image_base_url2',
            'printable_number',
            'printable_alert_number',
            'printer_keep_alive',
            'operator_id',
            'printable_alert_flag',

        ]);
    }
}
