<?php
declare(strict_types=1);

/**
 * /functional/notifications/preferences.php
 * Відповідає за:
 * - дефолтні налаштування email-сповіщень
 * - читання user_notification_settings
 * - збереження user_notification_settings
 * - перевірку, чи ввімкнено конкретний тип email-сповіщення
 */

if (!function_exists('ntf_pref_defaults')) {
    function ntf_pref_defaults(): array
    {
        return [
            'email_enabled'            => 1,
            'email_private_message'    => 1,
            'email_friend_request'     => 1,
            'email_group_invite'       => 1,
            'email_group_join_request' => 1,
            'email_comment_reply'      => 1,
            'email_post_comment'       => 1,
        ];
    }
}

if (!function_exists('ntf_pref_column_for_type')) {
    function ntf_pref_column_for_type(string $type): string
    {
        return match ($type) {
            'private_message'    => 'email_private_message',
            'friend_request'     => 'email_friend_request',
            'group_invite'       => 'email_group_invite',
            'group_join_request' => 'email_group_join_request',
            'comment_reply'      => 'email_comment_reply',
            'post_comment'       => 'email_post_comment',
            default              => '',
        };
    }
}

if (!function_exists('ntf_pref_existing_columns')) {
    function ntf_pref_existing_columns(PDO $pdo): array
    {
        $all = array_keys(ntf_pref_defaults());
        $out = [];

        foreach ($all as $col) {
            if (!function_exists('ntf_column_exists') || ntf_column_exists($pdo, 'user_notification_settings', $col)) {
                $out[] = $col;
            }
        }

        return $out;
    }
}

if (!function_exists('ntf_preferences_get')) {
    function ntf_preferences_get(PDO $pdo, int $userId): array
    {
        $defaults = ntf_pref_defaults();
        if ($userId <= 0) return $defaults;

        if (!function_exists('ntf_table_exists') || !ntf_table_exists($pdo, 'user_notification_settings')) {
            return $defaults;
        }

        $cols = ntf_pref_existing_columns($pdo);
        if (!$cols) {
            return $defaults;
        }

        try {
            $st = $pdo->prepare("
                SELECT " . implode(', ', $cols) . "
                FROM user_notification_settings
                WHERE user_id = ?
                LIMIT 1
            ");
            $st->execute([$userId]);
            $row = $st->fetch(PDO::FETCH_ASSOC) ?: [];

            foreach ($defaults as $k => $v) {
                if (array_key_exists($k, $row)) {
                    $defaults[$k] = ((int)$row[$k] === 1) ? 1 : 0;
                }
            }
        } catch (Throwable $e) {
            // fallback to defaults
        }

        return $defaults;
    }
}

if (!function_exists('ntf_preferences_save')) {
    function ntf_preferences_save(PDO $pdo, int $userId, array $input): bool
    {
        if ($userId <= 0) return false;
        if (!function_exists('ntf_table_exists') || !ntf_table_exists($pdo, 'user_notification_settings')) {
            return false;
        }

        $allDefaults = ntf_pref_defaults();
        $saveCols = ntf_pref_existing_columns($pdo);
        if (!$saveCols) {
            return false;
        }

        $data = [];
        foreach ($allDefaults as $k => $v) {
            $raw = $input[$k] ?? 0;
            $data[$k] = ((int)$raw === 1) ? 1 : 0;
        }

        $fields = ['user_id'];
        $values = [$userId];
        $placeholders = ['?'];
        $updates = [];

        foreach ($saveCols as $col) {
            $fields[] = $col;
            $values[] = $data[$col] ?? 0;
            $placeholders[] = '?';
            $updates[] = $col . ' = VALUES(' . $col . ')';
        }

        $hasCreatedAt = !function_exists('ntf_column_exists') || ntf_column_exists($pdo, 'user_notification_settings', 'created_at');
        $hasUpdatedAt = !function_exists('ntf_column_exists') || ntf_column_exists($pdo, 'user_notification_settings', 'updated_at');

        if ($hasCreatedAt) {
            $fields[] = 'created_at';
            $placeholders[] = 'NOW()';
        }
        if ($hasUpdatedAt) {
            $fields[] = 'updated_at';
            $placeholders[] = 'NOW()';
            $updates[] = 'updated_at = NOW()';
        }

        try {
            $sql = "
                INSERT INTO user_notification_settings (" . implode(', ', $fields) . ")
                VALUES (" . implode(', ', $placeholders) . ")
                ON DUPLICATE KEY UPDATE
                " . implode(",\n                ", $updates);

            $st = $pdo->prepare($sql);
            return $st->execute($values);
        } catch (Throwable $e) {
            return false;
        }
    }
}

if (!function_exists('ntf_preferences_is_enabled')) {
    function ntf_preferences_is_enabled(array $prefs, string $type): bool
    {
        if (((int)($prefs['email_enabled'] ?? 0)) !== 1) {
            return false;
        }

        $col = ntf_pref_column_for_type($type);
        if ($col === '') return false;

        return ((int)($prefs[$col] ?? 0) === 1);
    }
}