<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\MailTemplate;

class MailTemplateController extends Controller
{
    /**
     * 一覧表示
     */
   public function list(Request $request)
    {
        if ($request->input('action') === 'reset') {
            return redirect()->route('mail_templates');
        }

        // 許可されたソートカラム一覧
        $allowedSorts = [
            'mail_template_id',
            'pg_id',
            'internal_id',
            'mgr_cc_flag',
            'bcc_adrs',
            'use_flag',
            'memo',
            'subject',
            'text',
            'created_at',
            'updated_at',
            'operator_id',
        ];


        $sort = $request->input('sort', 'mail_template_id');
        $sort_type = $request->input('sort_type', 'desc');

        $allowedSorts = [
            'mail_template_id', 'pg_id', 'internal_id', 'mgr_cc_flag',
            'bcc_adrs', 'use_flag', 'memo', 'subject', 'text',
            'created_at', 'updated_at', 'operator_id'
        ];

        if (!in_array($sort, $allowedSorts)) {
            $sort = 'mail_template_id';
        }

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

        $query = MailTemplate::query();

        // 絞り込み
        if ($request->filled('mail_template_id')) {
            $query->where('mail_template_id', $request->mail_template_id);
        }
        if ($request->filled('pg_id')) {
            $query->where('pg_id', $request->pg_id);
        }
        if ($request->has('mgr_cc_flag') && $request->mgr_cc_flag !== '') {
            $query->where('mgr_cc_flag', $request->mgr_cc_flag);
        }
        if ($request->has('use_flag') && $request->use_flag !== '') {
            $query->where('use_flag', $request->use_flag);
        }
        if ($request->filled('subject')) {
            $query->where('subject', 'LIKE', "%{$request->subject}%");
        }

        $templates = $query->orderBy($sort, $sort_type)->paginate(20);

        return view('admin.mail_templates.list', compact(
            'templates', 'sort', 'sort_type'
        ));
    }


    /**
     * 新規登録
     */
    public function add(Request $request)
    {
        if ($request->isMethod('post')) {
            $data = $this->validateTemplate($request);
            MailTemplate::create($data);

            return redirect()->route('mail_templates')
                ->with('success', 'テンプレートを登録しました');
        }

        $mailTemplate = new MailTemplate();
        return view('admin.mail_templates.add', compact('mailTemplate'));
    }

    /**
     * 編集
     */
    public function edit($id, Request $request)
    {
        $mailTemplate = MailTemplate::findOrFail($id);

        if ($request->isMethod('post')) {
            $data = $this->validateTemplate($request);
            $mailTemplate->update($data);

            return redirect()->route('mail_templates')
                ->with('success', 'テンプレートを更新しました');
        }

        return view('admin.mail_templates.edit', compact('mailTemplate'));
    }

    /**
     * 詳細表示
     */
    public function info($id)
    {
        $mailTemplate = MailTemplate::findOrFail($id);

        return view('admin.mail_templates.info', compact('mailTemplate'));
    }

    /**
     * 削除
     */
    public function delete(Request $request)
    {
        $id = $request->input('id');
        if ($id) {
            MailTemplate::destroy($id);
            return redirect()->route('mail_templates')->with('success', 'テンプレートを削除しました');
        }
        return redirect()->route('mail_templates')->with('error', '削除対象が指定されていません');
    }

    /**
     * バリデーション共通化
     */
    private function validateTemplate(Request $request)
    {
        return $request->validate([
            'pg_id' => 'nullable|integer',
            'internal_id' => 'nullable|integer',
            'mgr_cc_flag' => 'nullable|boolean',
            'bcc_adrs' => 'nullable|string|max:255',
            'use_flag' => 'nullable|boolean',
            'memo' => 'nullable|string|max:255',
            'subject' => 'required|string|max:255',
            'text' => 'required|string',
            'operator_id' => 'nullable|integer',
        ]);
    }
}
