# Implementacija Mail Sustava

**Datum implementacije:** 20.03.2026
**Zadnje ažurirano:** 20.03.2026

## Pregled

Implementiran je sustav za automatsko slanje email notifikacija za rezervacije. Sustav pokriva nekoliko scenarija:
1. **Nova rezervacija** - Potvrda korisniku + notifikacija adminu
2. **Potvrđena rezervacija** - Email korisniku (guest ili admin akcija)
3. **Otkazana rezervacija** - Email korisniku (guest ili admin akcija)
4. **Kontakt forma** - Poruka s kontakt forme adminu (za buduću upotrebu)

---

## 📧 Kreirani Mail-ovi

### 1. ReservationConfirmationMail (Inicijalna potvrda)
**Datoteka:** `app/Mail/ReservationConfirmationMail.php`
**View:** `resources/views/emails/reservation-confirmation.blade.php`

**Svrha:** Šalje se korisniku kao potvrda njihove NOVE rezervacije

**Sadržaj:**
- Subject: "Potvrda rezervacije - Krčma Petrić"
- Podaci: Ime, datum, vrijeme, broj osoba, napomena
- **Gumbovi:** "Potvrdi Rezervaciju" (zeleni), "Otkaži Rezervaciju" (crveni)
- **VAŽNO:** Oba gumba vode na `/potvrdi-rezervaciju/{token}` stranicu (GET), NE direktno na POST akcije
- Kontakt informacije restorana
- Profesionalni, topli ton

**Primjer korištenja:**
```php
Mail::to($reservation->email)
    ->send(new ReservationConfirmationMail($reservation));
```

---

### 2. NewReservationNotificationMail (Admin notifikacija)
**Datoteka:** `app/Mail/NewReservationNotificationMail.php`
**View:** `resources/views/emails/new-reservation-notification.blade.php`

**Svrha:** Notifikacija administratoru o novoj rezervaciji

**Sadržaj:**
- Subject: "Nova rezervacija - [datum] [vrijeme]"
- Svi podaci o rezervaciji: ime, telefon, email, datum, vrijeme, broj osoba, napomena
- ID rezervacije i vrijeme prijave
- Status rezervacije
- Link "Pogledaj Rezervaciju" → `/potvrdi-rezervaciju/{token}`

**Primjer korištenja:**
```php
Mail::to(config('mail.from.address'))
    ->send(new NewReservationNotificationMail($reservation));
```

---

### 3. ReservationConfirmedMail (Potvrđena rezervacija) **NOVO!**
**Datoteka:** `app/Mail/ReservationConfirmedMail.php`
**View:** `resources/views/emails/reservation-confirmed.blade.php`

**Svrha:** Šalje se korisniku nakon što potvrdi rezervaciju (guest ili admin akcija)

**Sadržaj:**
- Subject: "Rezervacija potvrđena - Krčma Petrić"
- ✅ Hvala poruka
- Detalji potvrđene rezervacije (datum, vrijeme, broj osoba)
- Status: ✅ POTVRĐENO
- Link "Pogledaj Rezervaciju" (za eventualno otkazivanje)
- Kontakt informacije

**Kada se šalje:**
- Guest klikne "Potvrdi" na `/potvrdi-rezervaciju/{token}` stranici
- Admin klikne "Potvrdi" u dashboardu (`/admin/rezervacije`)

**Primjer korištenja:**
```php
// U ReservationConfirmationController@confirm
Mail::to($reservation->email)->send(new ReservationConfirmedMail($reservation));

// U AdminReservationsController@confirm
Mail::to($reservation->email)->send(new ReservationConfirmedMail($reservation));
```

---

### 4. ReservationCancelledMail (Otkazana rezervacija) **NOVO!**
**Datoteka:** `app/Mail/ReservationCancelledMail.php`
**View:** `resources/views/emails/reservation-cancelled.blade.php`

**Svrha:** Šalje se korisniku nakon što otkaže rezervaciju (guest ili admin akcija)

**Sadržaj:**
- Subject: "Rezervacija otkazana - Krčma Petrić"
- ❌ Potvrda otkazivanja
- Detalji otkazane rezervacije
- Status: ❌ OTKAZANO
- Link "Nova Rezervacija" → `/rezerviraj`
- Kontakt informacije
- Pozitivna poruka ("Nadamo se da ćemo vas uskoro vidjeti!")

**Kada se šalje:**
- Guest klikne "Otkaži" na `/potvrdi-rezervaciju/{token}` stranici
- Admin klikne "Otkaži" u dashboardu (`/admin/rezervacije`)

**Primjer korištenja:**
```php
// U ReservationConfirmationController@cancel
Mail::to($reservation->email)->send(new ReservationCancelledMail($reservation));

// U AdminReservationsController@cancel
Mail::to($reservation->email)->send(new ReservationCancelledMail($reservation));
```

---

### 5. ContactFormMail (Kontakt forma - za buduću upotrebu)
**Datoteka:** `app/Mail/ContactFormMail.php`
**View:** `resources/views/emails/contact-form.blade.php`

**Svrha:** Šalje poruke s kontakt forme na info email

**Sadržaj:**
- Subject: "Nova poruka s kontakt forme - [ime pošiljatelja]"
- Reply-To: postavljen na email pošiljatelja
- Podaci: ime, email, telefon (opcionalno), poruka
- Gumb za direktan odgovor

**Parametri:**
- `$contactName` - Ime i prezime pošiljatelja
- `$contactEmail` - Email pošiljatelja
- `$contactPhone` - Telefon (nullable)
- `$contactMessage` - Tekst poruke

**Primjer korištenja:**
```php
Mail::to(config('mail.from.address'))
    ->send(new ContactFormMail($name, $email, $phone, $message));
```

---

## 🔄 Ažurirani Kontroleri

### ReservationForm (Livewire)
**Datoteka:** `app/Livewire/ReservationForm.php`

**Promjene:**
```php
// NOVA rezervacija - šalju se 2 emaila
$reservation = Reservation::create($validated);

// 1. Admin notifikacija (uvijek)
Mail::to(config('mail.from.address'))
    ->send(new NewReservationNotificationMail($reservation));

// 2. Potvrda korisniku (samo ako ima email)
if ($reservation->email) {
    Mail::to($reservation->email)
        ->send(new ReservationConfirmationMail($reservation));
}
```

---

### ReservationConfirmationController (Guest akcije)
**Datoteka:** `app/Http/Controllers/ReservationConfirmationController.php`

**Dodano u `confirm()` metodu:**
```php
$reservation->confirm();

// Šalji confirmation email
try {
    Mail::to($reservation->email)->send(new ReservationConfirmedMail($reservation));
    Log::info('Confirmation email sent to guest');
} catch (\Exception $e) {
    Log::error('Failed to send confirmation email', [...]);
}
```

**Dodano u `cancel()` metodu:**
```php
$reservation->cancel();

// Šalji cancellation email
try {
    Mail::to($reservation->email)->send(new ReservationCancelledMail($reservation));
    Log::info('Cancellation email sent to guest');
} catch (\Exception $e) {
    Log::error('Failed to send cancellation email', [...]);
}
```

---

### AdminReservationsController (Admin akcije) **NOVO!**
**Datoteka:** `app/Http/Controllers/AdminReservationsController.php`

**`confirm()` metoda:**
```php
$reservation->confirm();

// Šalji confirmation email korisniku
try {
    Mail::to($reservation->email)->send(new ReservationConfirmedMail($reservation));
    Log::info('Admin confirmation email sent to guest', [
        'admin_user' => auth()->user()->email,
    ]);
} catch (\Exception $e) {
    Log::error('Failed to send admin confirmation email', [...]);
}
```

**`cancel()` metoda:**
```php
$reservation->cancel();

// Šalji cancellation email korisniku
try {
    Mail::to($reservation->email)->send(new ReservationCancelledMail($reservation));
    Log::info('Admin cancellation email sent to guest', [
        'admin_user' => auth()->user()->email,
    ]);
} catch (\Exception $e) {
    Log::error('Failed to send admin cancellation email', [...]);
}
```

---

## 📁 Struktura Datoteka

```
app/Mail/
├── ReservationConfirmationMail.php       # Nova rezervacija → korisniku
├── NewReservationNotificationMail.php    # Nova rezervacija → adminu
├── ReservationConfirmedMail.php          # ✅ Potvrđena → korisniku (NOVO)
├── ReservationCancelledMail.php          # ❌ Otkazana → korisniku (NOVO)
├── ContactFormMail.php                   # Kontakt forma → adminu
├── WelcomeMail.php                       # (postojeći - test mail)
├── MailEnvMail.php                       # (postojeći - test mail)
└── ServerReportMail.php                  # (postojeći - test mail)

resources/views/emails/
├── reservation-confirmation.blade.php    # Nova rezervacija (korisniku)
├── new-reservation-notification.blade.php # Nova rezervacija (adminu)
├── reservation-confirmed.blade.php       # ✅ Potvrđena (NOVO)
├── reservation-cancelled.blade.php       # ❌ Otkazana (NOVO)
├── contact-form.blade.php                # Kontakt forma
├── welcome.blade.php                     # (test)
├── mail-env.blade.php                    # (test)
└── server-report.blade.php               # (test)
```

---

## ⚙️ Konfiguracija

**Mail postavke** (`.env`):
```env
MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=server.konoba.hr
MAIL_PORT=465
MAIL_USERNAME=info@krcma-petric.com
MAIL_PASSWORD=***
MAIL_FROM_ADDRESS="info@krcma-petric.com"
MAIL_FROM_NAME="Krčma-Petrić"
```

---

## 🎯 Email Flow Matrix

| Akcija | Kome se šalje | Mail klasa | Trigger |
|--------|---------------|------------|---------|
| **Nova rezervacija** | Korisniku | `ReservationConfirmationMail` | `ReservationForm@submit()` |
| **Nova rezervacija** | Adminu | `NewReservationNotificationMail` | `ReservationForm@submit()` |
| **Guest potvrdi** | Korisniku | `ReservationConfirmedMail` | `ReservationConfirmationController@confirm()` |
| **Guest otkaže** | Korisniku | `ReservationCancelledMail` | `ReservationConfirmationController@cancel()` |
| **Admin potvrdi** | Korisniku | `ReservationConfirmedMail` | `AdminReservationsController@confirm()` |
| **Admin otkaže** | Korisniku | `ReservationCancelledMail` | `AdminReservationsController@cancel()` |
| **Kontakt forma** | Adminu | `ContactFormMail` | (za buduću upotrebu) |

---

## 🐛 Error Handling

Svi email slanju koriste **try-catch** blokove:

```php
try {
    Mail::to($email)->send(new SomeMail($data));
    Log::info('Email sent successfully', ['email' => $email]);
} catch (\Exception $e) {
    Log::error('Failed to send email', [
        'email' => $email,
        'error' => $e->getMessage(),
    ]);
}
```

**Benefit:** Greška u slanju emaila **ne prekida** poslovnu logiku (potvrda/otkazivanje i dalje radi)!

---

## 📝 Napomene

- ✅ Svi email templati koriste Laravel Markdown Mailables (`<x-mail::message>`)
- ✅ Svi mailovi imaju profesionalni, topli ton
- ✅ ContactFormMail ima `replyTo` postavljen na email pošiljatelja
- ✅ Email za potvrdu korisniku šalje se SAMO ako je korisnik ostavio email (opcionalno polje)
- ✅ Admin notifikacija šalje se UVIJEK na `info@krcma-petric.com`
- ✅ **Email linkovi koriste GET metode** - vode na stranicu, ne direktno na POST akcije
- ✅ Logging za sve poslane i neuspjele emailove

---

## ⚠️ Važno: Email Linkovi

**Problem:** Email linkovi (`<a href>`) su GET zahtjevi, ali Laravel rute za potvrdu/otkazivanje koriste POST metodu.

**Rješenje:**
- Linkovi u email-ima vode na **stranicu rezervacije**: `/potvrdi-rezervaciju/{token}` (GET zahtjev)
- Na stranici korisnik ima **POST forme** s gumbovima za potvrdu/otkazivanje
- Nema `MethodNotAllowedHttpException` grešaka!

```php
// Model methods - oba vraćaju istu GET rutu
public function getConfirmationUrlAttribute(): string {
    return route('reservation.confirm.show', ['token' => $this->confirmation_token]);
}

public function getCancellationUrlAttribute(): string {
    return route('reservation.confirm.show', ['token' => $this->confirmation_token]);
}
```

---

## ✅ Status Implementacije

**ZAVRŠENO ✅ - 20.03.2026**

- ✅ 4 Mail klase kreirane (confirmation, notification, confirmed, cancelled)
- ✅ 4 Email view-a kreirani (Markdown)
- ✅ Email integracija u ReservationForm (Livewire)
- ✅ Email integracija u ReservationConfirmationController (guest)
- ✅ Email integracija u AdminReservationsController (admin)
- ✅ Try-catch error handling za sve emailove
- ✅ Logging svih email akcija
- ✅ Email linkovi ispravljeni (GET, ne POST)
- ✅ Testirano i funkcionalno

**Sve radi! 🚀**

Kada bude potrebno implementirati kontakt formu:
1. Kreirati `app/Livewire/ContactForm.php` komponentu
2. Koristiti `ContactFormMail` za slanje
3. Integrirati u `resources/views/pages/contact.blade.php`
4. Koristiti Bootstrap 5 klase (NOT Tailwind) prema Bistro template strukturi
