<?php

namespace App\Http\Controllers;

use App\Models\Notification;
use App\Models\Customer;
use App\Models\TipeNotification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Yajra\DataTables\DataTables;
use App\Exports\NotifikasiExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use DateTime;

class NotificationController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('permission:view-notification', ['only' => ['index','show','listdata']]);
        $this->middleware('permission:create-notification', ['only' => ['create','store']]);
        $this->middleware('permission:edit-notification', ['only' => ['edit','update']]);
        $this->middleware('permission:delete-notification', ['only' => ['destroy']]);
    }

    public function index(Request $request)
    {
        return view('notification.index');
    }

    public function getParameter(Request $request, $id){
        $tipe = TipeNotification::find($id);

        return response()->json(['parameter' => $tipe->parameter]);
    }

    public function listdata()
    {
        $data = Notification::select('notification.subject as subject','notification.description as desc', 'notification.id as id', 'notification.schedule as jam', DB::raw("to_char(notification.schedule_day, 'DD-MM-YYYY') as day"),'tipe_notification.tipe as tipe')
            ->join('tipe_notification','notification.type_id', 'tipe_notification.id')
            ->get();

        return DataTables::of($data)->make(true);
    }
    public function create()
    {
        $notification = new Notification();
        $tipe = TipeNotification::all();
        $schedule = '';
        $hari = [
            0 => 'Hari-H',
            1 => 'H-1',
            2 => 'H-2',
            3 => 'H-3',
            4 => 'H-4',
            5 => 'H-5',
            6 => 'H-6',
            7 => 'H-7',
        ];
        return view('notification.create', compact('notification', 'tipe','schedule','hari'));
    }


    public function store(Request $request)
    {

        $schedule_day = $request->input('schedule_day');

        $schedule_day_converted = DateTime::createFromFormat('d-m-Y', $schedule_day);

        if ($schedule_day_converted) {
            $request->merge(['schedule_day' => $schedule_day_converted->format('Y-m-d')]);
        }

        $validateData = $request->validate([
            'type_id'=>[
                'required',
                function ($attribute, $value, $fail) {
                    $existingRecord = Notification::withoutTrashed()
                        ->where('type_id', $value)
                        ->where('type_id', [1,2,3])
                        ->first();

                    if ($existingRecord) {
                        $fail("Tipe Notifikasi sudah digunakan");
                    }
                },
            ],
            'description' => 'required',
            'subject' => 'required',
            'schedule' => 'required_if:type_id,1,4,5',
            'schedule_day' => 'required_if:type_id,5',
            'reminder'=>'required_if:type_id,4,7',
        ],[
            'type_id.required' => 'Tipe Notifikasi belum diisi',
            'description.required' => 'Deskripsi belum diisi',
            'subject.required' => 'Subjek belum diisi',
            'schedule.required_if' => 'Jam Tayang belum diisi',
            'schedule_day.required_if' => 'Tanggal belum diisi',
            'reminder.required_if' => 'Reminder belum diisi'
        ]);

        if ($request->type_id == 1){
            $notification = Notification::create([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'created_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
            ]);
        }elseif ($request->type_id == 4 || $request->type_id == 7){
            $notification = Notification::create([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'created_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
                'reminder'=> $request->reminder
            ]);
        } elseif ($request->type_id == 5){
            $notification = Notification::create([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'created_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
                'schedule_day' => $request->schedule_day
            ]);
        } elseif ($request->type_id == 2 || $request->type_id == 3 || $request->type_id == 6|| $request->type_id == 8){
            $notification = Notification::create([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'created_who' => Auth::user()->name,
            ]);
        }



        if($request->action=='save_and_close'){
            return redirect()->route('notification.index')
                ->with('success', 'Data Berhasil Disimpan');
        }else{
            return redirect()->route('notification.create')
                ->with('success', 'Data Berhasil Disimpan');
        }
    }


    public function show($id)
    {
        $notification = Notification::with('tipe_notifikasi')->where('id', $id)->first();
        if ($notification->schedule_day != null){
            $day = Carbon::parse($notification->schedule_day)->format('d-m-Y');
        } else {
            $day = ' ';
        }
        $hari = [
            0 => 'Hari-H',
            1 => 'H-1',
            2 => 'H-2',
            3 => 'H-3',
            4 => 'H-4',
            5 => 'H-5',
            6 => 'H-6',
            7 => 'H-7',
        ];
        $reminder = '';
        foreach ($hari as $rem => $value){
            if ($notification->reminder != null){
                if ($notification->reminder == $rem){
                    $reminder = $value;
                }
            } else {
                $reminder = '-';
            }
        }
        $customer = Customer::find($notification->customer_id);
        return view('notification.show', compact('notification', 'customer', 'day', 'reminder'));
    }

    public function edit($id)
    {
        $notification = Notification::find($id);
        if(!empty($notification->schedule_day)){
            $schedule = Carbon::parse($notification->schedule_day)->format('d-m-Y');
        }else{
            $schedule = '';
        }

        $tipe = TipeNotification::all();
        $hari = [
            0 => 'Hari-H',
            1 => 'H-1',
            2 => 'H-2',
            3 => 'H-3',
            4 => 'H-4',
            5 => 'H-5',
            6 => 'H-6',
            7 => 'H-7',
        ];
        return view('notification.edit', compact('notification', 'tipe', 'schedule', 'hari'));
    }


    public function update(Request $request,$id)
    {
        $schedule_day = $request->input('schedule_day');

        $schedule_day_converted = DateTime::createFromFormat('d/m/Y', $schedule_day);

        if ($schedule_day_converted) {
            $request->merge(['schedule_day' => $schedule_day_converted->format('Y-m-d')]);

        }
        $days = Carbon::parse($request->schedule_day)->format('Y-m-d');
        $validateData = $request->validate([
            'type_id'=>[
                'required',
                function ($attribute, $value, $fail) use($id){
                    $existingRecord = Notification::withoutTrashed()
                        ->where('type_id', $value)
                        ->where('type_id', [1,2,3])
                        ->where('id','!=',$id)
                        ->first();

                    if ($existingRecord) {
                        $fail("Tipe Notifikasi sudah digunakan");
                    }
                },
            ],
            'description' => 'required',
            'subject' => 'required',
            'schedule' => 'required_if:type_id,1,4,5',
            'schedule_day' => 'required_if:type_id,5',
            'reminder'=>'required_if:type_id,4,7',
        ],[
            'type_id.required' => 'Tipe Notifikasi belum diisi',
            'description.required' => 'Deskripsi belum diisi',
            'subject.required' => 'Subjek belum diisi',
            'schedule.required_if' => 'Jam Tayang belum diisi',
            'schedule_day.required_if' => 'Tanggal belum diisi',
            'reminder.required_if' => 'Reminder belum diisi'
        ]);

        $notification = Notification::find($id);

        if ($request->type_id == 1){
            $notification->update([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'updated_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
            ]);
        }elseif ($request->type_id == 4 || $request->type_id == 7){
            $notification->update([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'updated_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
                'reminder'=> $request->reminder
            ]);
        } elseif ($request->type_id == 5){

            $notification->update([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'updated_who' => Auth::user()->name,
                'schedule'=> $request->schedule,
                'schedule_day' => $days
            ]);
        } elseif ($request->type_id == 2 || $request->type_id == 3 || $request->type_id == 6|| $request->type_id == 8){
            $notification->update([
                'subject' => $request->subject,
                'description' =>  $request->description,
                'type_id' =>  $request->type_id,
                'updated_who' => Auth::user()->name,
            ]);
        }

        return redirect()->route('notification.index')
            ->with('success', 'Data Berhasil Diubah');
    }
    public function export_all()
    {

        return Excel::download(new NotifikasiExport(), 'data_notifikasi.xlsx');
    }

    public function destroy($id)
    {
        $notification = Notification::find($id);
        $response = [];
        try {
            $notification->delete();
            $response['message'] = 'Data berhasil dihapus.';
            return response()->json($response, 200);

        }catch (\Exception $e) {
            $response['message'] = 'Gagal menghapus data: ' . $e->getMessage();
            return response()->json($response, 500);
        }


    }
}
