<?php

namespace App\Http\Controllers;

use App\Models\ClosureMessage;
use App\Models\Helpers\General;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Validator;
use Yajra\DataTables\Facades\DataTables;

class ClosureMessageController extends Controller
{
    public function __construct()
    {
        return $this->middleware('auth');
    }


    public function index()
    {
        if (request()->ajax()) {
            $data = ClosureMessage::query()->where('id', '<>', auth()->user()->id);
            return DataTables::of($data)
                ->addColumn('custom_column', function ($row) {
                    // Custom column content here
                })
                ->addColumn('action', function ($query) {
                    return '
                        <div class="dropdown">
                    <button class="btn dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
                        <i class="fas fa-cog" aria-hidden="true"></i>
                    </button>
                    <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                        <a class="dropdown-item" href="' . route('closure.message.show.edit', $query->id) . '">Edit</a>
                        <a class="dropdown-item" href="' . route('closure.message.delete', $query->id) . '" onclick="return confirm(\'Do you want to delete this closure message?\')">Delete</a>
                    </ul>
                </div>';
                })
                ->rawColumns(['custom_column', 'action'])
                ->make(true);
        }
        return view('closure_message.index');
    }

    public function show_create()
    {
        return view('closure_message.create');
    }

    public function create(Request $request)
    {
        Session::put('closure_title', $request->title);
        Session::put('closure_message', $request->message);
        Session::put('closure_schedule', $request->schedule);

        $validator = Validator::make($request->all(), [
            'title' => 'required|string',
            'message' => 'required|string',
            'schedule' => 'required|date'
        ]);
        if ($validator->fails()) {
            return back()->withErrors($validator->errors()->all());
        } else {
            $schedule_check = ClosureMessage::query()->where('schedule', $request->schedule)->first();
            try {
                if ($schedule_check == null) {
                    ClosureMessage::create([
                        'title' => $request->title,
                        'message' => $request->message,
                        'created_by' => auth()->user()->id,
                        'schedule' => $request->schedule
                    ]);
                    Session::forget('closure_title');
                    Session::forget('closure_message');
                    Session::forget('closure_schedule');
                    return redirect()->route('closure.message.index')->with('success', 'Closure message has been created successfully');
                } else {
                    return back()->with('error', 'An existing closure message is scheduled for the selected date');
                }
            } catch (\Throwable $th) {
                General::logError('TRYING TO CREATE CLOSURE MESSAGE', $th->getMessage(), 'create method in ClosureMessageController');
                return back()->with('error', 'Error occurred while creating closure message');
            }
        }
    }

    public function show_edit($id)
    {
        $closure_message = ClosureMessage::find($id) ?? null;
        if ($closure_message !== null) {
            return view('closure_message.edit', compact('closure_message'));
        } else {
            General::logError('TRYING TO SHOW CLOSURE MESSAGE EDIT PAGE', 'Un-identified closure message ID: ' . $id, 'show_edit in ClosureMessageController');
            return back()->with('error', 'The closure message cannot be found');
        }
    }

    public function edit(Request $request, $id)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|string',
            'message' => 'required|string',
            'schedule' => 'required|date'
        ]);

        if ($validator->fails()) {
            return back()->withErrors($validator->errors()->all());
        } else {
            $schedule_check = ClosureMessage::query()
                ->where('schedule', $request->schedule)->first();
                // dd($id);
            try {
                if ($schedule_check !== null && $schedule_check->id == $id) {
                    $closure_message = ClosureMessage::find($id) ?? null;
                    if ($closure_message == null) {
                        General::logError('TRYING TO EDIT CLOSURE MESSAGE WITH ID: ' . $id, 'Un-identified closure message ID', 'edit method in ClosureMessageController');
                        return back()->with('error', 'The closure message you tried to edit cannot be found');
                    } else {
                        $closure_message->update($request->all());
                        return redirect()->route('closure.message.index')->with('success', 'Closure message has been updated successfully');
                    }
                } else {
                    return back()->with('error', 'An existing closure message is already scheduled for the selected date');
                }
            } catch (\Throwable $th) {
                General::logError('TRYING TO EDIT CLOSURE MESSAGE WITH ID: ' . $id, $th->getMessage(), 'edit method in ClosureMessageController');
                return back()->with('error', 'Sorry, error while editing closure message with ID:' . $id);
            }
        }
    }

    public function delete_message($id)
    {
        $closure_message = ClosureMessage::find($id) ?? null;
        if ($closure_message !== null) {
            $closure_message->delete();
            return back()->with('success', 'Closure message with id: ' . $id . ' has been deleted');
        } else {
            General::logError('TRYING TO DELETE CLOSURE MESSAGE WITH ID: ' . $id, 'Un-identified closure message id', 'delete_message in ClosureMessageController');
            return back()->with('error', 'The closure message you attempted to delete cannot be found');
        }
    }
}
