<?php

namespace App\Domain\Compliance\Enums;

/**
 * What a member is being asked to agree to.
 *
 * Each is a separate decision on purpose. Bundling "we may publish your child's
 * photograph" into "you accept the terms of service" is how consent becomes
 * meaningless, and this product does publish children's photographs on a public
 * website.
 */
enum ConsentType: string
{
    case Terms = 'terms';
    case Privacy = 'privacy';
    case PhotoMedia = 'photo_media';
    case Marketing = 'marketing';
    case MedicalTreatment = 'medical_treatment';
    case DataProcessing = 'data_processing';

    public function label(): string
    {
        return match ($this) {
            self::Terms => 'شروط الاستخدام',
            self::Privacy => 'سياسة الخصوصية',
            self::PhotoMedia => 'نشر الصور ومقاطع الفيديو',
            self::Marketing => 'الرسائل التسويقية',
            self::MedicalTreatment => 'الإسعاف والتدخل الطبي',
            self::DataProcessing => 'معالجة البيانات الشخصية',
        };
    }

    public function description(): string
    {
        return match ($this) {
            self::Terms => 'قواعد الاشتراك والحضور والدفع.',
            self::Privacy => 'ما نجمعه من بيانات وكيف نستخدمه.',
            self::PhotoMedia => 'استخدام صور ' . term('member_definite') . ' ومقاطع الفيديو على موقع الأكاديمية وحساباتها. يمكن سحب الموافقة في أي وقت.',
            self::Marketing => 'العروض والأخبار عبر واتساب. لا يشمل إشعارات الحصص والمستحقات.',
            self::MedicalTreatment => 'التصرف الطبي العاجل عند وقوع إصابة أثناء التدريب.',
            self::DataProcessing => 'حفظ بيانات ' . term('member_definite') . ' ومعالجتها لإدارة الاشتراك.',
        };
    }

    /**
     * Without these the academy cannot lawfully run the membership at all, so
     * they gate the portal. Everything else is genuinely optional, and an
     * optional consent that blocks the app is not optional.
     */
    public function isRequired(): bool
    {
        return match ($this) {
            self::Terms, self::Privacy, self::DataProcessing => true,
            default => false,
        };
    }

    /** @return array<int, self> */
    public static function required(): array
    {
        return array_values(array_filter(self::cases(), fn (self $case) => $case->isRequired()));
    }
}
