<?php

namespace App\Http\Controllers\Admin;

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

class CityController extends Controller
{
    public function list(Request $request)
    {
        $sort = $request->input('sort', 'city_id');
        $sortType = $request->input('sort_type', 'asc');
        $page = $request->get('page', 1);

        $query = City::query();

        if ($request->filled('city_name')) {
            $query->where('city_name', 'like', '%' . $request->input('city_name') . '%');
        }

        // 排序处理
        if (!empty($sort)) {
            $query->orderBy($sort, $sortType);
        }

        $list = $query->paginate(20);

        // 页码越界处理
        if ($list->total() > 0 && $page > $list->lastPage()) {
            return redirect()->route('city', [
                'sort' => $sort,
                'sort_type' => $sortType,
            ]);
        }

        return view('admin.CityMaster.list', [
            'isMethodPost' => $request->isMethod('post'),
            'sort' => $sort,
            'sort_type' => $sortType,
            'list' => $list,
            'page' => $page,
        ]);
    }

    public function add(Request $request)
    {
        $inputs = [
            'city_name' => '',
            'print_layout' => '',
            'city_user' => '',
            'city_remarks' => '',
        ];

        if ($request->isMethod('POST')) {
            $rules = [
                'city_name' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'print_layout' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'city_user' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'city_remarks' => ['nullable', 'string', 'max:20'],
            ];
            $messages = [
                'city_name.required' => '市区名は必須です。',
                'city_name.regex' => '市区名は全角で入力してください。',
                'print_layout.required' => '印字レイアウトファイルは必須です。',
                'print_layout.regex' => '印字レイアウトファイルは全角で入力してください。',
                'city_user.required' => '顧客M入力不要フィールドIDは必須です。',
                'city_user.regex' => '顧客M入力不要フィールドIDは全角で入力してください。',
                'city_remarks.max' => '備考は20文字以内で入力してください。',
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            $inputs = array_merge($inputs, $request->all());

            if (!$validator->fails()) {
                $maxId = DB::table('city')->max('city_id');
                $newCityId = $maxId ? $maxId + 1 : 1;

                $city = new City();
                $city->city_id = $newCityId;
                $city->fill($request->only([
                    'city_name',
                    'print_layout',
                    'city_user',
                    'city_remarks',
                ]));

                if ($city->save()) {
                    $request->session()->flash('success', __('登録に成功しました'));
                    return redirect()->route('city');
                } else {
                    $request->session()->flash('error', __('登録に失敗しました'));
                }
            } else {
                $inputs['errorMsg'] = $validator->errors()->all();
            }
        }

        return view('admin.CityMaster.add', $inputs);
    }

    public function edit(Request $request, $pk, $view = '')
    {
        $city = City::find($pk);
        if (!$city) {
            abort(404);
        }

        if ($request->isMethod('POST')) {
            $rules = [
                'city_name' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'print_layout' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'city_user' => ['required', 'string', 'max:10', 'regex:/^[^ -~｡-ﾟ]+$/u'],
                'city_remarks' => ['nullable', 'string', 'max:20'],
            ];
            $messages = [
                'city_name.required' => '市区名は必須です。',
                'city_name.regex' => '市区名は全角で入力してください。',
                'print_layout.required' => '印字レイアウトファイルは必須です。',
                'print_layout.regex' => '印字レイアウトファイルは全角で入力してください。',
                'city_user.required' => '顧客M入力不要フィールドIDは必須です。',
                'city_user.regex' => '顧客M入力不要フィールドIDは全角で入力してください。',
                'city_remarks.max' => '備考は20文字以内で入力してください。',
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            if (!$validator->fails()) {
                $city->fill($request->only([
                    'city_name',
                    'print_layout',
                    'city_user',
                    'city_remarks',
                ]));

                if ($city->save()) {
                    $request->session()->flash('success', __('更新に成功しました'));
                    return redirect()->route('city');
                } else {
                    $request->session()->flash('error', __('更新に失敗しました'));
                }
            } else {
                return view('admin.CityMaster.edit', [
                    'city' => $city,
                    'errorMsg' => $validator->errors()->all(),
                ]);
            }
        }

        return view($view ?: 'admin.CityMaster.edit', [
            'city' => $city,
        ]);
    }

    public function info(Request $request, $pk)
    {
        return $this->edit($request, $pk, 'CityMaster.info');
    }

    public function delete(Request $request)
    {
        $arr_pk = $request->get('pk');
        if (!$arr_pk) {
            return redirect()->route('city')->with('error', __('削除する市区を選択してください。'));
        }
        if (City::destroy($arr_pk)) {
            return redirect()->route('city')->with('success', __("削除が完了しました。"));
        } else {
            return redirect()->route('city')->with('error', __('削除に失敗しました。'));
        }
    }
}