<?php

namespace App\Http\Controllers\Admin;

use App\Models\Ptype;
use App\Utils;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Response;

class PtypeController extends Controller
{
    public function list(Request $request)
    {
        // 受け取る入力値
        $inputs = [
            'isMethodPost' => $request->isMethod('post') ? 1 : 0,
            'isExport' => 0,
            'sort' => $request->input('sort', 'ptype_id'),     // デフォルト: ID
            'sort_type' => strtolower($request->input('sort_type', 'asc')),
            'page' => $request->get('page', 1),
        ];

        // 許可するソート可能カラム
        $allowedSortColumns = [
            'ptype_id',
            'ptype_subject',
            'floor_sort',
            'created_at',
        ];

        // 検索クエリ作成
        $query = \App\Models\Ptype::query();

        // ソート処理
        if (in_array($inputs['sort'], $allowedSortColumns, true)) {
            $sortType = in_array($inputs['sort_type'], ['asc', 'desc'], true)
                ? $inputs['sort_type']
                : 'asc';

            $query->orderBy($inputs['sort'], $sortType);
        } else {

            $query->orderBy('ptype_id', 'asc');
        }

        // ページネーション
        $inputs['list'] = $query->paginate(20);

        // ページが超過している場合リダイレクト
        if ($inputs['list']->total() > 0 && $inputs['page'] > $inputs['list']->lastPage()) {
            return redirect()->route('ptypes');
        }

        // 画面へ
        return view('admin.ptypes.list', $inputs);
    }

   
    /**
    * 新規登録（画面/処理）
    */
    public function add(Request $request)
    {
        if ($request->isMethod('get')) {
            // 新規時は空のレコードを用意してフォーム描画
            return view('admin.ptypes.add', [
                'isEdit' => false,
                'record' => new Ptype(), // ← ★ Blade側で record->〇〇 が使える
            ]);
        }

        // POST時：バリデーション
        $rules = [
            'ptype_subject' => 'required|string|max:255',
            'ptype_remarks' => 'nullable|string|max:255',
        ];
        $messages = [
            'ptype_subject.required' => '駐輪分類名は必須です。',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        DB::transaction(function () use ($request) {
            $new = new Ptype();
            $new->fill($request->only(['ptype_subject', 'ptype_remarks']));
            $new->save();
        });

        return redirect()->route('ptypes')->with('success', '登録しました。');
    }

    /**
     * 編集（画面/処理）
     */
    public function edit(Request $request, $id)
    {
        // 該当データ取得
        $record = Ptype::find($id);
        if (!$record) {
            abort(404);
        }

        if ($request->isMethod('get')) {
            // 編集画面表示
            return view('admin.ptypes.edit', [
                'isEdit' => true,
                'record' => $record,
            ]);
        }

        // POST時：バリデーション
        $rules = [
            'ptype_subject' => 'required|string|max:255',
            'floor_sort' => 'nullable|string|max:50',

            'ptype_remarks' => 'nullable|string|max:255',
        ];
        $messages = [
            'ptype_subject.required' => '駐輪分類名は必須です。',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        DB::transaction(function () use ($request, $record) {
            $record->fill($request->only(['ptype_subject','floor_sort', 'ptype_remarks']));
            $record->save();
        });

        return redirect()->route('ptypes')->with('success', '更新しました。');
    }

    /**
     * 削除（単一／複数対応）
     */
    public function delete(Request $request)
    {
        $ids = [];

        if ($request->filled('id')) {
            $ids[] = (int) $request->input('id');
        }

        if (is_array($request->input('pk'))) {
            $ids = array_merge($ids, $request->input('pk'));
        }

        $ids = array_values(array_unique(array_map('intval', $ids)));

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

        Ptype::whereIn('ptype_id', $ids)->delete();

        return redirect()->route('ptypes')->with('success', '削除しました。');
    }

    public function getDataDropList()
    {
        $data = [];
        return $data;
    }

    public function export(Request $request)
    {

        $headers = array(
            "Content-type" => "text/csv;charset=UTF-8",
            'Content-Encoding: UTF-8',
            "Content-Disposition" => "attachment; filename=file.csv",
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        );
        $inputs = [
            'isMethodPost' => 0,
            'isExport' => 1,
            'sort' => $request->input('sort', ''),
            'sort_type' => $request->input('sort_type', ''),

        ];

        $dataExport = Ptype::search($inputs);
        $columns = array(
            __('駐輪分類ID'),
            __('駐輪分類名'),
            __('備考'),
        );
        $filename = "駐輪分類マスタ.csv";
        $file = fopen($filename, 'w+');
        fputcsv($file, $columns);
        foreach ($dataExport as $items) {
            fputcsv($file, array(
                $items->ptype_id,
                $items->ptype_subject,
                $items->ptype_remarks,
            ));
        }
        fclose($file);
        return Response::download($filename, $filename, $headers);
    }

    public function import(Request $request)
    {
        $file = $request->file('file');
        if (!empty($file)) {
            $data = Utils::csvToArray($file);
            $type = 1;
            $msg = '';
            $record = 0;
            DB::beginTransaction();
            try {
                Ptype::query()->delete();
                $col = 3;
                foreach ($data as $key => $items) {
                    $record = $key + 2;
                    if (count($items) == $col) {
                        $row = new Ptype();
                        $row->ptype_id = $items[0];
                        $row->ptype_subject = $items[1];
                        $row->ptype_remarks = $items[2];
                        if (!$row->save()) {
                            $type = 0;
                            $msg = '行:record型が一致しません。';
                            break;
                        }
                    } else {
                        $type = 0;
                        $msg = '行:record列数が一致しません。';
                        break;
                    }
                }
            } catch (\Exception $e) {
                dd($e);
                $msg = '行:record型が一致しません。';
                $type = 0;
            }
            if ($type) {
                DB::commit();
                return redirect()->route('ptypes')->with('success', __('輸入成功'));
            } else {
                DB::rollBack();
                return redirect()->route('ptypes')->with('error', __($msg, ['record' => $record]));
            }
        } else {
            return redirect()->route('ptypes')->with('error', __('あなたはcsvファイルを選択していません。'));
        }
    }

}