<?php


namespace App\Livewire\Calendar\Modals;

use App\Models\Event;
use Carbon\Carbon;
use LivewireUI\Modal\ModalComponent;

class EventModal extends ModalComponent
{
    public $eventId = null;

    public $date;

    public $title = '';
    public $color = '#6366f1';

    // 🔥 GLOBAL
    public $time = '12:00';
    public $end_time = null;

    // 🔥 EXCEPTION (GETRENNT!)
    public $exception_time = null;
    public $exception_end_time = null;

    public $start_date = null;
    public $end_date = null;
    public $is_all_day = false;

    public $use_exception = false;

    public function mount($date = null, $eventId = null)
    {
        $tz = auth()->user()->timezone;

        $this->eventId = $eventId;

        if ($eventId) {

            $event = Event::findOrFail($eventId);

            $this->title = $event->title;
            $this->color = $event->color ?? '#6366f1';

            $start = $event->starts_at->timezone($tz);
            $end   = $event->ends_at?->timezone($tz);

            $this->start_date = $start->format('Y-m-d');
            $this->end_date   = $end ? $end->format('Y-m-d') : $this->start_date;

            $this->date = $date ?? $this->start_date;

            // 🔥 GLOBAL ZEIT
            $this->time = $start->format('H:i');
            $this->end_time = $end?->format('H:i');

            // 🔥 DEFAULT → exception = global
            $this->exception_time = $this->time;
            $this->exception_end_time = $this->end_time;

            // 🔥 EXCEPTIONS CHECK
            $exceptions = $event->exceptions ?? [];

            if (is_string($exceptions)) {
                $exceptions = json_decode($exceptions, true);
            }

            if (is_array($exceptions)) {
                foreach ($exceptions as $ex) {

                    if (($ex['date'] ?? null) === $this->date) {

                        $this->use_exception = true;

                        $this->exception_time = $ex['start'] ?? $this->time;
                        $this->exception_end_time = $ex['end'] ?? $this->end_time;
                    }
                }
            }

            $this->is_all_day = $event->is_all_day ?? false;

            if ($this->is_all_day) {
                $this->time = null;
                $this->end_time = null;
                $this->exception_time = null;
                $this->exception_end_time = null;
            }

        } else {

            $this->date = $date ?? now($tz)->format('Y-m-d');
            $this->start_date = $this->date;
            $this->end_date = $this->date;
        }
    }

    public function updatedUseException($value)
    {
        if ($value) {
            $this->exception_time = $this->time;
            $this->exception_end_time = $this->end_time;
        }
    }

    public function save()
    {
        if (!trim($this->title)) return;

        $event = Event::findOrFail($this->eventId);
        $tz = auth()->user()->timezone;

        // 🔥 EXCEPTIONS
        $exceptions = $event->exceptions ?? [];

        if (is_string($exceptions)) {
            $exceptions = json_decode($exceptions, true);
        }

        if (!is_array($exceptions)) {
            $exceptions = [];
        }

        $exceptions = collect($exceptions)
            ->filter(fn($ex) =>
                isset($ex['date']) &&
                $ex['date'] >= $this->start_date &&
                $ex['date'] <= $this->end_date
            )
            ->values()
            ->toArray();

        // alte entfernen
        $exceptions = collect($exceptions)
            ->reject(fn($ex) => $ex['date'] === $this->date)
            ->values()
            ->toArray();

        // 🔥 EXCEPTION SETZEN
        if ($this->use_exception) {

            $exceptions[] = [
                'date'  => $this->date,
                'start' => $this->exception_time,
                'end'   => $this->exception_end_time,
            ];

            $event->update([
                'exceptions' => $exceptions
            ]);

        } else {

            // 🔥 GLOBAL UPDATE
            if ($this->is_all_day) {

                $start = Carbon::createFromFormat('Y-m-d', $this->start_date, 'UTC')->startOfDay();
                $end   = Carbon::createFromFormat('Y-m-d', $this->end_date ?? $this->start_date, 'UTC')->endOfDay();

            } else {

                $start = Carbon::parse(
                    $this->start_date . ' ' . ($this->time ?? '00:00'),
                    $tz
                )->setTimezone('UTC');

                $end = Carbon::parse(
                    $this->end_date . ' ' . ($this->end_time ?? $this->time ?? '00:00'),
                    $tz
                )->setTimezone('UTC');
            }

            $event->update([
                'title'      => $this->title,
                'color'      => $this->color,
                'starts_at'  => $start,
                'ends_at'    => $end,
                'is_all_day' => $this->is_all_day,
                'exceptions' => $exceptions,
            ]);
        }

        $this->dispatch('eventCreated');
        $this->closeModal();
    }

    public function render()
    {
        return view('livewire.calendar.modals.event-modal');
    }
}

//class EventModal extends ModalComponent
//{
//    public $eventId = null;
//
//    public $date;
//
//    public $title = '';
//    public $color = '#6366f1';
//
//    public $time = '12:00';
//    public $end_time = null;
//
//    public $exception_time = null;
//    public $exception_end_time = null;
//
//    public $start_date = null;
//    public $end_date = null;
//    public $is_all_day = false;
//
//    // 🔥 NEU
//    public $use_exception = false;
//
//    public function mount($date = null, $eventId = null)
//    {
//        $tz = auth()->user()->timezone;
//
//        $this->eventId = $eventId;
//
//        if ($eventId) {
//
//            $event = Event::findOrFail($eventId);
//
//            $this->title = $event->title;
//            $this->color = $event->color ?? '#6366f1';
//
//            $start = $event->starts_at->timezone($tz);
//            $end = $event->ends_at?->timezone($tz);
//
//            $this->start_date = $start->format('Y-m-d');
//            $this->end_date = $end ? $end->format('Y-m-d') : $this->start_date;
//
//            $this->date = $date ?? $this->start_date;
//
//            $displayStart = $start;
//            $displayEnd = $end;
//
//            $exceptions = $event->exceptions ?? [];
//
//            if (is_string($exceptions)) {
//                $exceptions = json_decode($exceptions, true);
//            }
//
//            // 🔥 CHECK: hat dieser Tag Exception?
//            if (is_array($exceptions)) {
//                foreach ($exceptions as $ex) {
//
//                    if (($ex['date'] ?? null) === $this->date) {
//
//                        $this->use_exception = true;
//
//                        if (!empty($ex['start'])) {
//                            $displayStart = $start->copy()->setTimeFromTimeString($ex['start']);
//                        }
//
//                        if (!empty($ex['end'])) {
//                            $displayEnd = $end
//                                ? $end->copy()->setTimeFromTimeString($ex['end'])
//                                : $start->copy()->setTimeFromTimeString($ex['end']);
//                        }
//                    }
//                }
//            }
//
//            $this->time = $displayStart->format('H:i');
//            $this->end_time = $displayEnd?->format('H:i');
//
//            $this->is_all_day = $event->is_all_day ?? false;
//
//            if ($this->is_all_day) {
//                $this->time = null;
//                $this->end_time = null;
//            }
//
//        } else {
//
//            $this->date = $date ?? now($tz)->format('Y-m-d');
//            $this->start_date = $this->date;
//            $this->end_date = $this->date;
//        }
//    }
//
//    public function save()
//    {
//        if (!trim($this->title)) return;
//
//        $event = Event::findOrFail($this->eventId);
//
//        $tz = auth()->user()->timezone;
//
//        /*
//        |--------------------------------------------------------------------------
//        | 🔥 EXCEPTIONS laden
//        |--------------------------------------------------------------------------
//        */
//
//        $exceptions = $event->exceptions ?? [];
//
//        if (is_string($exceptions)) {
//            $exceptions = json_decode($exceptions, true);
//        }
//
//        if (!is_array($exceptions)) {
//            $exceptions = [];
//        }
//
//        // 👉 alten Eintrag entfernen
//        $exceptions = collect($exceptions)
//            ->reject(fn($ex) => $ex['date'] === $this->date)
//            ->values()
//            ->toArray();
//
//        /*
//        |--------------------------------------------------------------------------
//        | 🔥 FALL 1: NUR EXCEPTION (kein global update!)
//        |--------------------------------------------------------------------------
//        */
//
//        if ($this->use_exception) {
//
//            $exceptions[] = [
//                'date'  => $this->date,
//                'start' => $this->time,
//                'end'   => $this->end_time,
//            ];
//
//            $event->update([
//                'exceptions' => $exceptions
//            ]);
//
//        } else {
//
//            /*
//            |--------------------------------------------------------------------------
//            | 🔥 FALL 2: GLOBAL UPDATE
//            |--------------------------------------------------------------------------
//            */
//
//            if ($this->is_all_day) {
//
//                $start = Carbon::createFromFormat('Y-m-d', $this->start_date, 'UTC')->startOfDay();
//                $end   = Carbon::createFromFormat('Y-m-d', $this->end_date ?? $this->start_date, 'UTC')->endOfDay();
//
//            } else {
//
//                $start = Carbon::parse(
//                    $this->start_date . ' ' . ($this->time ?? '00:00'),
//                    $tz
//                )->setTimezone('UTC');
//
//                $end = Carbon::parse(
//                    $this->end_date . ' ' . ($this->end_time ?? $this->time ?? '00:00'),
//                    $tz
//                )->setTimezone('UTC');
//            }
//
//            $event->update([
//                'title'      => $this->title,
//                'color'      => $this->color,
//                'starts_at'  => $start,
//                'ends_at'    => $end,
//                'is_all_day' => $this->is_all_day,
//                'exceptions' => $exceptions,
//            ]);
//        }
//
//        $this->dispatch('eventCreated');
//        $this->closeModal();
//    }
//
//
//    public function render()
//    {
//        return view('livewire.calendar.modals.event-modal');
//    }
//}

//
//
//namespace App\Livewire\Calendar\Modals;
//
//use App\Models\Event;
//use Carbon\Carbon;
//use LivewireUI\Modal\ModalComponent;
//
//class EventModal extends ModalComponent
//{
//    public $eventId = null;
//
//    public $date;
//    public $title = '';
//    public $color = '#6366f1';
//
//    public $time = '12:00';
//    public $end_time = null;
//
//    public $start_date = null;
//    public $end_date = null;
//
//    public $is_all_day = false;
//
//    public function mount($date = null, $eventId = null)
//    {
//        $tz = auth()->user()->timezone;
//
//        $this->eventId = $eventId;
//
//        if ($eventId) {
//
//            $event = Event::findOrFail($eventId);
//
//            $this->title = $event->title;
//            $this->color = $event->color ?? '#6366f1';
//
//            $start = $event->starts_at->timezone($tz);
//            $end = $event->ends_at?->timezone($tz);
//
//            // 👉 GLOBAL (immer korrekt)
//            $this->start_date = $start->format('Y-m-d');
//            $this->end_date   = $end
//                ? $end->format('Y-m-d')
//                : $start->format('Y-m-d');
//
//            // 👉 aktueller Klick-Tag
//            $this->date = $date ?? $this->start_date;
//
//            $displayStart = $start;
//            $displayEnd = $end;
//
//            // 🔥 EXCEPTIONS
//            $exceptions = $event->exceptions;
//
//            if (is_string($exceptions)) {
//                $exceptions = json_decode($exceptions, true);
//            }
//
//            if (is_array($exceptions) && $this->date) {
//                foreach ($exceptions as $ex) {
//
//                    if (($ex['date'] ?? null) === $this->date) {
//
//                        if (!empty($ex['start'])) {
//                            $displayStart = $start->copy()->setTimeFromTimeString($ex['start']);
//                        }
//
//                        if (!empty($ex['end'])) {
//                            $displayEnd = $start->copy()->setTimeFromTimeString($ex['end']);
//                        }
//                    }
//                }
//            }
//
//            $this->time = $displayStart->format('H:i');
//            $this->end_time = $displayEnd?->format('H:i');
//
//            $this->is_all_day = $event->is_all_day ?? false;
//
//            if ($this->is_all_day) {
//                $this->time = null;
//                $this->end_time = null;
//            }
//
//        } else {
//
//            $this->date = $date ?? now($tz)->format('Y-m-d');
//            $this->start_date = $this->date;
//        }
//    }
//
//    public function save()
//    {
//        if (!trim($this->title)) return;
//
//        $user = auth()->user();
//        $tz = $user->timezone;
//
//        // 🔥 DEFAULT: end_date setzen wenn leer
//        if (!$this->end_date) {
//            $this->end_date = $this->start_date;
//        }
//
//        if ($this->is_all_day) {
//
//            $start = Carbon::parse($this->start_date)->startOfDay();
//
//            $end = Carbon::parse($this->end_date)->endOfDay();
//
//        } else {
//
//            $start = Carbon::parse(
//                $this->start_date . ' ' . ($this->time ?? '00:00'),
//                $tz
//            )->setTimezone('UTC');
//
//            $end = Carbon::parse(
//                $this->end_date . ' ' . ($this->end_time ?? $this->time ?? '00:00'),
//                $tz
//            )->setTimezone('UTC');
//        }
//
//        Event::updateOrCreate(
//            ['id' => $this->eventId],
//            [
//                'user_id'   => $user->id,
//                'title'     => $this->title,
//                'starts_at' => $start,
//                'ends_at'   => $end,
//                'is_all_day'=> $this->is_all_day,
//                'color'     => $this->color,
//            ]
//        );
//
//        $this->dispatch('eventCreated');
//        $this->closeModal();
//    }
//
//
//    public function render()
//    {
//        return view('livewire.calendar.modals.event-modal');
//    }
//}

//namespace App\Livewire\Calendar\Modals;
//
//use App\Models\Event;
//use Carbon\Carbon;
//use LivewireUI\Modal\ModalComponent;

//class EventModal extends ModalComponent
//{
//    public $eventId = null;
//
//    public $date;
//    public $title = '';
//    public $color = '#6366f1';
//
//    public $time = '12:00';
//
//    public $end_date = null;
//    public $end_time = null;
//
//    public $is_all_day = false;
//
//    public function mount($date = null, $eventId = null)
//    {
//        $tz = auth()->user()->timezone;
//
//        $this->eventId = $eventId;
//
//        if ($eventId) {
//
//            $event = Event::findOrFail($eventId);
//
//            $this->title = $event->title;
//
//            // 👉 Klick-Tag verwenden (WICHTIG)
//            $this->date = $date
//                ?? $event->starts_at->timezone($tz)->format('Y-m-d');
//
//            $start = $event->starts_at->timezone($tz);
//            $end = $event->ends_at?->timezone($tz);
//
//            $displayStart = $start;
//            $displayEnd = $end;
//
//            // 🔥 EXCEPTIONS
//            $exceptions = $event->exceptions;
//
//            if (is_string($exceptions)) {
//                $exceptions = json_decode($exceptions, true);
//            }
//
//            if (is_array($exceptions) && $this->date) {
//                foreach ($exceptions as $ex) {
//
//                    if (($ex['date'] ?? null) === $this->date) {
//
//                        if (!empty($ex['start'])) {
//                            $displayStart = $start->copy()->setTimeFromTimeString($ex['start']);
//                        }
//
//                        if (!empty($ex['end'])) {
//                            $displayEnd = $end
//                                ? $end->copy()->setTimeFromTimeString($ex['end'])
//                                : $start->copy()->setTimeFromTimeString($ex['end']);
//                        }
//                    }
//                }
//            }
//
//            // 👉 Werte setzen
//            $this->time = $displayStart->format('H:i');
//
//            if ($displayEnd) {
//
//                $eventEndDate = $displayEnd->format('Y-m-d');
//
//                // 👉 IMMER echtes Enddatum setzen
//                $this->end_date = $eventEndDate;
//
//                $this->end_time = $displayEnd->format('H:i');
//            }
//
//            // 🔥 ALL DAY LOGIK
//            $this->is_all_day = $event->is_all_day ?? false;
//
//            // 👉 wenn Urlaub → keine Zeit anzeigen
//            if ($this->is_all_day) {
//                $this->time = null;
//                $this->end_time = null;
//            }
//
//        } else {
//            $this->date = $date ?? now($tz)->format('Y-m-d');
//        }
//    }
//
//    public function save()
//    {
//        if (!trim($this->title)) return;
//
//        $user = auth()->user();
//        $tz = $user->timezone;
//
//        // 🔥 FALL 1: GANZTÄGIG (Urlaub etc.)
//        if ($this->is_all_day) {
//
//            $start = Carbon::parse($this->date)->startOfDay();
//
//            $end = $this->end_date
//                ? Carbon::parse($this->end_date)->endOfDay()
//                : $start->copy()->endOfDay();
//
//            Event::updateOrCreate(
//                ['id' => $this->eventId],
//                [
//                    'user_id' => $user->id,
//                    'title' => $this->title,
//                    'starts_at' => $start,
//                    'ends_at' => $end,
//                    'is_all_day' => true,
//                    'color' => $this->color,
//                ]
//            );
//
//        } else {
//
//            // 🔥 NORMAL / SEMINAR
//            $start = Carbon::parse(
//                $this->date . ' ' . ($this->time ?? '00:00'),
//                $tz
//            )->setTimezone('UTC');
//
//            $end = null;
//
//            if ($this->end_date) {
//
//                if ($this->end_time) {
//                    $end = Carbon::parse(
//                        $this->end_date . ' ' . $this->end_time,
//                        $tz
//                    )->setTimezone('UTC');
//                } else {
//                    $end = Carbon::parse($this->end_date)->endOfDay();
//                }
//            }
//
//            Event::updateOrCreate(
//                ['id' => $this->eventId],
//                [
//                    'user_id' => $user->id,
//                    'title' => $this->title,
//                    'starts_at' => $start,
//                    'ends_at' => $end,
//                    'is_all_day' => false,
//                ]
//            );
//        }
//
//        $this->dispatch('eventCreated');
//        $this->closeModal();
//    }
//
//    public function render()
//    {
//        return view('livewire.calendar.modals.event-modal');
//    }
//}

//
//
//namespace App\Livewire\Calendar\Modals;
//
//use App\Models\Event;
//use Carbon\Carbon;
//use LivewireUI\Modal\ModalComponent;
//
//class EventModal extends ModalComponent
//{
//    public $eventId = null;
//
//    public $date;
//    public $title = '';
//
//    public $time = '12:00';
//
//    public $end_date = null;
//    public $end_time = null;
//    public $is_all_day = false;
//
//    public function mount($date = null, $eventId = null)
//    {
//        $tz = auth()->user()->timezone;
//
//        $this->eventId = $eventId;
//
//        if ($eventId) {
//
//            $event = Event::findOrFail($eventId);
//
//            $this->title = $event->title;
//
//            // ✅ WICHTIG: geklickten Tag verwenden
//            $this->date = $date
//                ?? $event->starts_at->timezone($tz)->format('Y-m-d');
//
//            $this->time = $event->starts_at->timezone($tz)->format('H:i');
//
//            $start = $event->starts_at->timezone($tz);
//            $end   = $event->ends_at?->timezone($tz);
//
//            $displayStart = $start;
//            $displayEnd   = $end;
//
//// 🔥 EXCEPTIONS berücksichtigen
//            $exceptions = $event->exceptions;
//
//            if (is_string($exceptions)) {
//                $exceptions = json_decode($exceptions, true);
//            }
//
//            if (is_array($exceptions) && $date) {
//
//                foreach ($exceptions as $ex) {
//
//                    if (($ex['date'] ?? null) === $date) {
//
//                        if (!empty($ex['start'])) {
//                            $displayStart = $start->copy()->setTimeFromTimeString($ex['start']);
//                        }
//
//                        if (!empty($ex['end'])) {
//                            $displayEnd = $start->copy()->setTimeFromTimeString($ex['end']);
//                        }
//                    }
//                }
//            }
//
//// 🔥 Werte ins Modal übernehmen
//            $this->time = $displayStart->format('H:i');
//
//            if ($displayEnd) {
//                $this->end_time = $displayEnd->format('H:i');
//                $this->end_date = $displayEnd->format('Y-m-d');
//            }
//
//        } else {
//            $this->date = $date ?? now($tz)->format('Y-m-d');
//        }
//    }
//
//    public function save()
//    {
//        if (!trim($this->title)) return;
//
//        $user = auth()->user();
//        $tz = $user->timezone;
//
//        $start = Carbon::parse($this->date . ' ' . $this->time, $tz)->setTimezone('UTC');
//
//        $end = null;
//
//        // 🔥 END DATUM gesetzt
//        if ($this->end_date) {
//
//            // 👉 FALL 1: mit Uhrzeit (Seminar)
//            if ($this->end_time) {
//
//                $end = Carbon::parse(
//                    $this->end_date . ' ' . $this->end_time,
//                    $tz
//                )->setTimezone('UTC');
//
//            } // 👉 FALL 2: ohne Uhrzeit (Urlaub)
//            else {
//
//                $end = Carbon::parse($this->end_date)->endOfDay();
//            }
//        }
//
//        Event::updateOrCreate(
//            ['id' => $this->eventId],
//            [
//                'user_id' => $user->id,
//                'title' => $this->title,
//                'starts_at' => $start,
//                'ends_at' => $end,
//                'is_all_day' => !$this->end_time && $this->end_date,
//            ]
//        );
//
//        $this->dispatch('eventCreated');
//        $this->closeModal();
//    }
//
//    public function render()
//    {
//        return view('livewire.calendar.modals.event-modal');
//    }
//}
