# One-Click Domain Setup Wizard

`/panel/domains/wizard` — kullanıcı sadece domain adını yazar, geri kalan
her şey otomatik kurulur. Felsefe: **hiçbir manuel adım yok**.

## Akış (4 adım)

```
[1] Domain   →  [2] Seçenekler  →  [3] Onayla  →  [4] Live Kurulum
     ↓              ↓                    ↓              ↓
  FQDN check    Toggle'lar         Özet card    Polling (2s)
                (8 ayar)                        → JSON status
```

Step 1-3 client-side (Vue), step 4 backend `wizardStore` çağrıldıktan sonra.

## Otomatik kurulanlar (default açık)

| Adım | Servis | Tetikleyici | Süre |
|---|---|---|---|
| Apache vhost (HTTP+HTTPS) | `sysapi('vhost-add')` | `DomainProvisioner::add` | ~3sn |
| DNS zone (33 kayıt) | PowerDNS API | `CreateDnsZoneOnDomainAdded` listener | ~5sn |
| 6 sistem subdomain | `sysapi('vhost-add')` × 6 | `SystemSubdomainProvisioner` | ~10sn |
| AutoSSL multi-SAN cert | certbot | `AutoSslOnDomainAdded` listener (5dk delay) | ~5dk |
| Geçici "Yakında" sayfası | `onx-user-add` create dir | DomainProvisioner içinde | instant |

### İsteğe bağlı (opt-in)

| Adım | Servis | Süre |
|---|---|---|
| `info@domain` mailbox | `MailboxProvisioningJob` | ~10sn |
| WordPress install | `InstallWordPressJob` (Phase 2) | ~3dk |

## Mimari — neden çoğu adım otomatik?

`DomainProvisioner::add()` çağrıldığında:

1. **Vhost** — `sysapi('vhost-add')` (synchronous, transaction içinde)
2. **DB transaction commit** → `DomainAdded` event dispatch
3. **Event listener'lar paralel tetiklenir**:
   - `CreateDnsZoneOnDomainAdded` → `DnsProvisioner::createZone` (sync)
   - `AutoSslOnDomainAdded` → `ProvisionAutoSslJob` (5dk delay, queue)
4. **`provisionSystemSubdomainsSafely()`** — 6 subdomain vhost paralel yazılır
5. **`onx-user-add` script** — public_html'de index.html + .htaccess yazar

Yani wizardStore'da tek yapmamız gereken `provisioner->add()` çağrısı.

## Backend endpoint'ler

```php
GET  /panel/domains/wizard                 → Wizard.vue (step 1)
POST /panel/domains/wizard                 → provision + Wizard.vue (step 4)
GET  /panel/domains/{domain}/wizard-status → JSON live status
```

### `wizardStatus` response

```json
{
  "vhost":        "done",        // pending | in_progress | done | failed
  "dns":          "done",
  "subdomains":   "done",
  "ssl":          "in_progress", // AutoSSL 5dk DNS propagation
  "default_site": "done",
  "email":        "skipped",     // opt-in değilse skipped
  "wordpress":    "skipped",
  "last_error":   null
}
```

Vue tarafında `setInterval(pollStatus, 2000)` — tüm state `done|skipped`
veya herhangi biri `failed` olduğunda durur.

## State machine (her adım için)

```
   pending → in_progress → done
                    ↓
                  failed
                    ↓
                  skipped (opt-in kapalı)
```

`ProgressStep` component visual:
- `pending` — gri yavaş spinner
- `in_progress` — mavi hızlı spinner, pulse ring
- `done` — yeşil tick
- `failed` — kırmızı X
- `skipped` — gri tire, label üstü çizili

## Manuel müdahale gerekebilecek tek nokta

**DNS propagation.** Domain'in A kaydı zaten sunucu IP'sine bakıyor olmalı
ki AutoSSL certbot challenge geçsin. Wizard step 1'de bu hatırlatma var.
Propagation 5-30 dakika sürebilir; bu süre içinde domain HTTPS değil HTTP
döner (vhost zaten ayakta).

## Hızlı Ekle (advanced opt-out)

`Customer/Domains/Index.vue` — küçük "Hızlı Ekle" butonu eski modal'ı açar.
Subdomain/parked domain eklemek isteyen power user'lar için. Sihirbaz her
zaman `addon` tipinde domain kurar.

## Bileşenler

- `resources/js/Components/Stepper.vue` — yatay 4-adım göstergesi
- `resources/js/Components/Toggle.vue` — iOS-style switch (label + desc)
- `resources/js/Components/ProgressStep.vue` — tek satır status item
- `resources/js/Components/ProgressList.vue` — vertical connector list
- `resources/js/Pages/Customer/Domains/Wizard.vue` — ana sayfa (4 step)

## Faz 2 — kalan işler

- [ ] `InstallWordPressJob` — wp-cli ile WP core + DB + admin user
- [ ] `SystemSubdomainProvisioner::statusFor` gerçek vhost-list çağırsın
      (şu an stateless `active: true` döner)
- [ ] DNS zone status polling — `dns_zones.status` enum bekleniyor
- [ ] Admin/Accounts/Create.vue — "Setup Plan" sekmesi (primary domain,
      default mailboxes, default DB, WordPress)
