<?php

namespace App\Http\Controllers\Admin;

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

class PrintAreaController extends Controller
{
    // 一覧
    public function list(Request $request)
    {
        $sort = $request->input('sort', 'print_area_id');
        $sort_type = $request->input('sort_type', 'asc');

        $list = PrintArea::orderBy($sort, $sort_type)->paginate(20);

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

    // 新規
    public function add(Request $request)
    {
        if ($request->isMethod('post')) {
            $validated = $request->validate([
                'print_area_name' => 'required|string|max:32',
                'park_id' => 'required|integer',
            ]);

            $validated['operator_id'] = auth()->id(); // 現在のログインユーザーを記録
            PrintArea::create($validated);

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

        $parks = Park::pluck('park_name', 'park_id');
        return view('admin.print_areas.add', compact('parks'));
    }

    // 編集
    public function edit(Request $request, $print_area_id)
    {
        $record = PrintArea::findOrFail($print_area_id);

        if ($request->isMethod('post')) {
            $validated = $request->validate([
                'print_area_name' => 'required|string|max:32',
                'park_id' => 'required|integer',
            ]);

            $validated['operator_id'] = auth()->id(); // 更新者を記録
            $record->update($validated);

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

        $parks = Park::pluck('park_name', 'park_id');
        return view('admin.print_areas.edit', compact('record', 'parks'));
    }

    // 詳細
    public function info(Request $request, $print_area_id)
    {
        $record = PrintArea::with('park')->findOrFail($print_area_id);
        return view('admin.print_areas.info', compact('record'));
    }

    /**
     * 印刷範囲マスタ削除処理
     */
    public function delete(Request $request, $id = null)
    {
        // 一覧画面（checkboxで複数削除）
        $ids = $request->input('pk');

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

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

        // バリデーション：配列 or 単一でも整数確認
        $request->validate([
            'pk' => 'nullable',
            'pk.*' => 'integer',
        ]);

        try {
            // 削除処理
            $deleted = PrintArea::destroy($ids);

            if ($deleted > 0) {
                return redirect()
                    ->route('print_areas')
                    ->with('success', '削除しました。');
            } else {
                return redirect()
                    ->route('print_areas')
                    ->with('error', '削除に失敗しました。');
            }
        } catch (\Exception $e) {
            \Log::error('印刷範囲削除エラー: ' . $e->getMessage());

            return redirect()
                ->route('print_areas')
                ->with('error', '削除中にエラーが発生しました。');
        }
    }

    public function export(Request $request)
    {
        // ファイル名を日本語付きで指定（Excelで問題なく開けるようにUTF-8にBOMも付加）
        $filename = 'シール印刷範囲マスタ' . now()->format('YmdHis') . '.csv';

        $data = PrintArea::with('park')->get();

        // UTF-8 BOM (Excel用)
        $bom = "\xEF\xBB\xBF";

        // CSVヘッダー
        $csv = implode(",", ['印刷範囲ID', '印刷範囲名', '駐輪場ID', '駐輪場名']) . "\n";

        foreach ($data as $item) {
            $csv .= implode(",", [
                $item->print_area_id,
                $item->print_area_name,
                $item->park_id,
                optional($item->park)->park_name,
            ]) . "\n";
        }

        return response($bom . $csv)
            ->header('Content-Type', 'text/csv; charset=UTF-8')
            // filename* にすれば日本語名も安全に動作
            ->header('Content-Disposition', "attachment; filename*=UTF-8''" . rawurlencode($filename));
    }


    // CSVインポート（仮）
    public function import(Request $request)
    {
        // 実装未
        return redirect()->route('print_areas')->with('success', 'CSVインポート処理（未実装）');
    }
}
