<?php

namespace App\Http\Controllers\Admin;

use App\Models\City;
use App\Http\Requests\ParkRequest;
use App\Models\Park;
use App\Utils;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Response;
use Symfony\Component\HttpFoundation\StreamedResponse;

class ParkController extends Controller
{
public function list(Request $request)
{
    $query = \DB::table('park as p')
        ->leftJoin('city as c', 'p.city_id', '=', 'c.city_id')
        ->select([
            'p.*',
            'c.city_name',
        ]);

    if ($request->filled('park_name')) {
        $query->where('p.park_name', 'like', '%' . $request->input('park_name') . '%');
    }
    if ($request->filled('city_id')) {
        $query->where('p.city_id', $request->input('city_id'));
    }
    if ($request->filled('sort')) {
        $query->orderBy($request->input('sort'), $request->input('sort_type', 'asc'));
    } else {
        $query->orderBy('p.park_id', 'asc');
    }

    $parks = $query->paginate(20);
    $cities = \DB::table('city')->orderBy('city_id')->get();

    $sort = $request->input('sort', 'p.park_id');
    $sort_type = $request->input('sort_type', 'asc');
    return view('admin.parks.list', compact('parks', 'cities', 'sort', 'sort_type'));
}

    public function add(Request $request)
    {
        $cities = \DB::table('city')->orderBy('city_id')->get();

        if ($request->isMethod('post')) {
            // バリデーション（必要な項目だけ例示）
            $validated = $request->validate([
                'city_id' => 'required|integer',
                'park_name' => 'required|string|max:255',
                // 他の項目も必要に応じて追加
            ]);

            // 保存処理
            $park = new \App\Models\Park();
            $park->fill($validated);
            $park->operator_id = auth()->user()->ope_id ?? 1; 
            $park->save();

            return redirect()->route('parks')->with('success', '新規登録に完了しました。');
        }

        return view('admin.parks.add', [
            'cities' => $cities,
        ]);
    }

    public function edit(Request $request, $pk, $view = '')
    {
    $park = Park::find($pk);
        if (empty($pk) || empty($park)) {
            abort('404');
        }
        $data = $park->getAttributes();
        $dataList = $this->getDataDropList();
        $data = array_merge($data, $dataList);
    if ($request->isMethod('POST') || $request->isMethod('PUT')) {
            // ここをaddと同じバリデーションに変更
            $validated = $request->validate([
                'city_id' => 'required|integer',
                'park_name' => 'required|string|max:255',
                // 他の項目も必要に応じて追加
            ]);

            \DB::transaction(function () use ($validated, &$type, $park) {
                $park->fill($validated);
                $park->save();
                $type = true;
            });
            $request->session()->flash('success', __('更新に成功しました'));
            return redirect()->route('parks');
        }
        if ($view != '') {
            return view($view, $data);
        }
        return view('admin.parks.edit', [
            'park' => $park,
            'cities' => $dataList['cities'] ?? [],
            // 必要な他の変数もここで渡す
        ]);
    }

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

    public function info(Request $request, $id)
    {
        return $this->edit($request, $id, 'admin.parks.info');
    }

    public function getDataDropList()
    {
        $data['cities'] = City::orderBy('city_id')->get();
        return $data;
    }



public function export(Request $request)
{
    $columns = [
        '駐輪場ID', '市区', '駐輪場名', '駐輪場ふりがな', '駐輪場五十音', '住所',
        '閉設フラグ', '閉設日', '残警告チェックフラグ', '印字数', '最新キープアライブ',
        '更新オペレータID', '更新期間開始日', '更新期間開始時', '更新期間終了日', '更新期間終了時',
        '駐輪開始期間', 'リマインダー種別', 'リマインダー時間', '契約後即利用許可',
        '項目表示設定：性別', '項目表示設定：生年月日', '項目表示設定：防犯登録番号',
        '二点間距離', '駐車場座標（緯度）', '駐車場座標（経度）', '電話番号',
        '駐輪場契約形態（定期）', '駐輪場契約形態（一時利用）', '車種制限', '手続方法', '支払方法',
        '利用可能時間制限フラグ', '利用可能時間（開始）', '利用可能時間（終了）',
        '常駐管理人フラグ', '常駐時間（開始）', '常駐時間（終了）',
        '屋根フラグ', 'シール発行機フラグ', '駐輪場利用方法', '定期更新期間',
        '空き待ち予約', '特記事項', '学生証確認種別',
        '減免案内表示フラグ', '減免対象年齢', '減免案内表示開始月数', '年跨ぎ'
    ];

    $dataExport = DB::table('park as p')
        ->select([
            'p.park_id', 'p.city_id', 'p.park_name', 'p.park_ruby', 'p.park_syllabary', 'p.park_adrs',
            'p.park_close_flag', 'p.park_day', 'p.alert_flag', 'p.print_number', 'p.keep_alive',
            'p.operator_id', 'p.update_grace_period_start_date', 'p.update_grace_period_start_time',
            'p.update_grace_period_end_date', 'p.update_grace_period_end_time',
            'p.parking_start_grace_period', 'p.reminder_type', 'p.reminder_time', 'p.immediate_use_permit',
            'p.gender_display_flag', 'p.bd_display_flag', 'p.securityreg_display_flag',
            'p.distance_twopoints', 'p.park_latitude', 'p.park_longitude', 'p.park_tel',
            'p.park_fixed_contract', 'p.park_temporary_contract', 'p.park_restriction',
            'p.park_procedure', 'p.park_payment',
            'p.park_available_time_flag', 'p.park_available_time_from', 'p.park_available_time_to',
            'p.park_manager_flag', 'p.park_manager_resident_from', 'p.park_manager_resident_to',
            'p.park_roof_flag', 'p.park_issuing_machine_flag', 'p.park_using_method',
            'p.park_contract_renewal_term', 'p.park_reservation', 'p.park_reference',
            'p.student_id_confirm_type', 'p.reduction_guide_display_flag', 'p.reduction_age',
            'p.reduction_guide_display_start_month', 'p.overyear_flag'
        ])
        ->orderBy('p.park_id', 'asc')
        ->get();

    $response = new StreamedResponse(function () use ($dataExport, $columns) {
        $stream = fopen('php://output', 'w');
        // Excel兼容 BOM
        fwrite($stream, chr(0xEF) . chr(0xBB) . chr(0xBF));
        fputcsv($stream, $columns);

        foreach ($dataExport as $item) {
            fputcsv($stream, [
                $item->park_id, $item->city_id, $item->park_name, $item->park_ruby, $item->park_syllabary, $item->park_adrs,
                $item->park_close_flag, $item->park_day, $item->alert_flag, $item->print_number, $item->keep_alive,
                $item->operator_id, $item->update_grace_period_start_date, $item->update_grace_period_start_time,
                $item->update_grace_period_end_date, $item->update_grace_period_end_time,
                $item->parking_start_grace_period, $item->reminder_type, $item->reminder_time, $item->immediate_use_permit,
                $item->gender_display_flag, $item->bd_display_flag, $item->securityreg_display_flag,
                $item->distance_twopoints, $item->park_latitude, $item->park_longitude, $item->park_tel,
                $item->park_fixed_contract, $item->park_temporary_contract, $item->park_restriction,
                $item->park_procedure, $item->park_payment,
                $item->park_available_time_flag, $item->park_available_time_from, $item->park_available_time_to,
                $item->park_manager_flag, $item->park_manager_resident_from, $item->park_manager_resident_to,
                $item->park_roof_flag, $item->park_issuing_machine_flag, $item->park_using_method,
                $item->park_contract_renewal_term, $item->park_reservation, $item->park_reference,
                $item->student_id_confirm_type, $item->reduction_guide_display_flag, $item->reduction_age,
                $item->reduction_guide_display_start_month, $item->overyear_flag
            ]);
        }

        fclose($stream);
    });

    $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
    $response->headers->set('Content-Disposition', 'attachment; filename="駐輪場マスタ.csv"');
    $response->headers->set('Cache-Control', 'no-store, no-cache');

    return $response;
}

    public function import(Request $request)
    {
        $file = $request->file('file');
        if (!empty($file)) {
            $data = Utils::csvToArray($file);
            $type = 1;
            $msg = '';
            $record = 0;
            DB::beginTransaction();
            try {
                Park::query()->delete();
                $col = 13;
                foreach ($data as $key => $items) {
                    $record = $key + 2;
                    if (count($items) == $col) {
                        $row = new Park();
                        $row->park_id = $items[0];
                        $row->city_id = $items[1];
                        $row->park_name = $items[3];
                        $row->park_ruby = $items[4];
                        $row->park_syllabary = $items[5];
                        $row->park_adrs = $items[6];
                        $row->park_close_flag = $items[7];
                        $row->park_day = $items[9];
                        $row->alert_flag = $items[10];
                        $row->print_number = $items[11];
                        $row->keep_alive = $items[12];
                        if (!$row->save()) {
                            $type = 0;
                            $msg = '行:record型が一致しません。';
                            break;
                        }
                    } else {
                        $type = 0;
                        $msg = '行:record列数が一致しません。';
                        break;
                    }
                }
            } catch (\Exception $e) {
                $msg = '行:record型が一致しません。';
                $type = 0;
            }
            if ($type) {
                DB::commit();
                return redirect()->route('parks')->with('success', __('輸入成功'));
            } else {
                DB::rollBack();
                return redirect()->route('parks')->with('error', __($msg, ['record' => $record]));
            }
        } else {
            return redirect()->route('parks')->with('error', __('あなたはcsvファイルを選択していません。'));
        }
    }

    public function checkDuplicate(\Illuminate\Http\Request $request)
    {
        $parkName = $request->input('park_name');
        $duplicate = Park::where('park_name', $parkName)->first();
        if ($duplicate) {
            return response()->json([
                'duplicate' => true,
                'park_id' => $duplicate->park_id,
                'park_name' => $duplicate->park_name,
            ]);
        }
        return response()->json(['duplicate' => false]);
    }
}