<?php

namespace App\Core\EmailHosting;

use App\Core\Product\AbstractProduct;

/**
 * PRC-847 — e-posta hosting modülleri için temel sınıf. Module Actions plumbing'ini
 * (getClientActions 4 panel + handleClientAction op-dispatch) sağlar; alt modül yalnız
 * gerçekten desteklediği typed metodları override eder. AbstractVm/AbstractSsl deseni.
 */
abstract class AbstractEmailHosting extends AbstractProduct implements EmailHostingInterface
{
    protected function ok(string $message = '', array $data = []): array
    {
        return ['status' => 'success', 'message' => $message, 'data' => $data];
    }

    protected function fail(string $message, array $data = []): array
    {
        return ['status' => 'error', 'message' => $message, 'data' => $data];
    }

    /**
     * PRC-847 — EmailHosting kendi kendine yeten bir aile (API/cache tabanlı, iç
     * sunucu yok) — Ssl/Software/License gibi. Provisioning sunucu seçimi
     * yapmasın (AbstractProduct default'u true). Aksi halde sunucusuz email ürünü
     * "No active server found" ile fail eder.
     */
    public function requiresServer(): bool
    {
        return false;
    }

    /** 4 e-posta yönetim paneli (clientarea Module Actions). */
    public function getClientActions(): array
    {
        $actions = parent::getClientActions(); // default password-change vb.
        $actions['mailboxes'] = ['label' => 'Posta Kutuları', 'icon' => 'fas fa-inbox', 'class' => 'btn-outline-primary', 'enabled' => true];
        $actions['aliases'] = ['label' => 'Takma Adlar', 'icon' => 'fas fa-tags', 'class' => 'btn-outline-primary', 'enabled' => true];
        $actions['forwarders'] = ['label' => 'Yönlendirmeler', 'icon' => 'fas fa-share', 'class' => 'btn-outline-primary', 'enabled' => true];
        $actions['spam'] = ['label' => 'Spam Kuralları', 'icon' => 'fas fa-shield-halved', 'class' => 'btn-outline-primary', 'enabled' => true];
        return $actions;
    }

    /**
     * Panel form'ları action + `op` alanıyla POST eder → typed metoda yönlendir.
     * op yoksa 'list' varsayılır (panel açılışında listeyi getir).
     */
    public function handleClientAction(string $action, array $params): array
    {
        $op = $params['op'] ?? 'list';

        return match ($action) {
            'mailboxes' => match ($op) {
                'list'         => $this->listMailboxes($params),
                'create'       => $this->createMailbox($params),
                'delete'       => $this->deleteMailbox($params),
                'password'     => $this->setMailboxPassword($params),
                'quota'        => $this->setMailboxQuota($params),
                default        => $this->fail('Bilinmeyen işlem: ' . $op),
            },
            'aliases' => match ($op) {
                'list'   => $this->listAliases($params),
                'create' => $this->createAlias($params),
                'delete' => $this->deleteAlias($params),
                default  => $this->fail('Bilinmeyen işlem: ' . $op),
            },
            'forwarders' => match ($op) {
                'list'   => $this->listForwarders($params),
                'create' => $this->createForwarder($params),
                'delete' => $this->deleteForwarder($params),
                default  => $this->fail('Bilinmeyen işlem: ' . $op),
            },
            'spam' => match ($op) {
                'list'   => $this->listSpamRules($params),
                'create' => $this->addSpamRule($params),
                'delete' => $this->removeSpamRule($params),
                default  => $this->fail('Bilinmeyen işlem: ' . $op),
            },
            default => parent::handleClientAction($action, $params),
        };
    }

    // ---- Typed default'lar: desteklenmiyor (alt modül override eder) ----
    public function listMailboxes(array $params): array { return $this->ok('', ['mailboxes' => []]); }
    public function createMailbox(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function deleteMailbox(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function setMailboxPassword(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function setMailboxQuota(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function listAliases(array $params): array { return $this->ok('', ['aliases' => []]); }
    public function createAlias(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function deleteAlias(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function listForwarders(array $params): array { return $this->ok('', ['forwarders' => []]); }
    public function createForwarder(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function deleteForwarder(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function listSpamRules(array $params): array { return $this->ok('', ['blocklist' => [], 'whitelist' => []]); }
    public function addSpamRule(array $params): array { return $this->fail('Desteklenmiyor'); }
    public function removeSpamRule(array $params): array { return $this->fail('Desteklenmiyor'); }
}
