<?php

namespace App\Domains\Event\Actions\CreateEvent;

use App\Enumerations\EatingHabit;
use App\Models\AvailablePaymentMethod;
use App\Models\Event;
use App\Models\Tenant;
use App\RelationModels\EventEatingHabits;
use App\RelationModels\EventLocalGroups;
use App\RelationModels\EventPaymentMethods;
use Illuminate\Support\Str;

class CreateEventCommand {
    private CreateEventRequest $request;
    public function __construct(CreateEventRequest $request) {
        $this->request = $request;
    }
    public function execute(): CreateEventResponse {
        $response = new CreateEventResponse();



        $prefix = $this->request->begin->format('Y-m_');
        if (!str_starts_with($this->request->name, $prefix)) {
            $this->request->name = $prefix . $this->request->name;
        }


        $event = Event::create([
            'tenant' => app('tenant')->slug,
            'name' => $this->request->name,
            'identifier' => Str::random(10),
            'location' => $this->request->location,
            'postal_code' => $this->request->postalCode,
            'email' => $this->request->email,
            'start_date' => $this->request->begin,
            'end_date' => $this->request->end,
            'early_bird_end' => $this->request->earlyBirdEnd,
            'registration_final_end' => $this->request->registrationFinalEnd,
            'early_bird_end_amount_increase' => $this->request->earlyBirdEndAmountIncrease,
            'account_owner' => $this->request->accountOwner,
            'account_iban' => $this->request->accountIban,
            'participation_fee_type' => $this->request->participationFeeType->slug,
            'pay_per_day' => $this->request->payPerDay,
            'pay_direct' => false,
            'total_max_amount' => 0,
            'support_per_person' => 0,
            'support_flat' => 0,
            // Umsatzsteuerliche Grundlage bei Anlage einfrieren (unveränderlich), damit Preisermittlung und
            // spätere Rechnungen von späteren Tenant-Änderungen unberührt bleiben.
            'tax_liable' => app('tenant')->tax_liable,
            'vat_rate' => app('tenant')->vat_rate,
            'vat_pricing_mode' => app('tenant')->vat_pricing_mode,
            'tax_exemption_reason' => app('tenant')->tax_exemption_reason,
            'tax_exemption_note' => app('tenant')->tax_exemption_note,
        ]);

        if ($event !== null) {
            EventEatingHabits::create([
                'event_id' => $event->id,
                'eating_habit_id' => EatingHabit::where('slug', EatingHabit::EATING_HABIT_VEGAN)->first()->id,
            ]);

            EventEatingHabits::create([
                'event_id' => $event->id,
                'eating_habit_id' => EatingHabit::where('slug', EatingHabit::EATING_HABIT_VEGETARIAN)->first()->id,
            ]);

            foreach (AvailablePaymentMethod::where('active', true)->get() as $availablePaymentMethod) {
                EventPaymentMethods::create([
                    'event_id' => $event->id,
                    'slug' => $availablePaymentMethod->slug,
                    'configuration' => $availablePaymentMethod->configuration ?? [],
                ]);
            }

            if (app('tenant')->slug === 'lv') {
                foreach(Tenant::where(['is_active_local_group' => true])->get() as $tenant) {
                    EventLocalGroups::create(['event_id' => $event->id, 'local_group_id' => $tenant->id]);
                }
            } else {
                EventLocalGroups::create(['event_id' => $event->id, 'local_group_id' => app('tenant')->id]);
            }


            $response->success = true;
            $response->event = $event;
        }

        return $response;
    }
}
