import type { getDb } from '@/server/db'
import {
    DESKTOP_NOTIFICATION_SETTING_ID,
    getDefaultNotificationSettings,
    isKnownNotificationSettingId,
    resolveNotificationSettingId,
    type NotificationSettingId,
} from '@/lib/notifications/notificationSettingCatalog'
import { pickRowNumber } from '@/server/pgRow'

type AppDb = Awaited<ReturnType<typeof getDb>>

export type UserNotificationPrefs = {
    push: boolean
    record: boolean
    desktopEnabled: boolean
}

function defaultPrefsForSetting(settingId: NotificationSettingId): UserNotificationPrefs {
    const item = getDefaultNotificationSettings().find((s) => s.id === settingId)
    return {
        push: item?.pushEnabled ?? false,
        record: item?.recordEnabled ?? true,
        desktopEnabled: false,
    }
}

export async function getUserNotificationPrefs(
    db: AppDb,
    userId: string,
    notificationType: string
): Promise<UserNotificationPrefs> {
    const settingId = resolveNotificationSettingId(notificationType)

    const desktopRow = await db.get<Record<string, unknown>>(
        `SELECT push_enabled AS pushEnabled
         FROM user_notification_settings
         WHERE user_id = ? AND notification_setting_id = ?`,
        [userId, DESKTOP_NOTIFICATION_SETTING_ID]
    )
    const desktopEnabled = pickRowNumber(desktopRow, 'pushEnabled', 'push_enabled') === 1

    if (!settingId) {
        return { push: true, record: true, desktopEnabled }
    }

    const row = await db.get<Record<string, unknown>>(
        `SELECT push_enabled AS pushEnabled, record_enabled AS recordEnabled
         FROM user_notification_settings
         WHERE user_id = ? AND notification_setting_id = ?`,
        [userId, settingId]
    )

    if (!row) {
        const defaults = defaultPrefsForSetting(settingId)
        return { ...defaults, desktopEnabled }
    }

    return {
        push: pickRowNumber(row, 'pushEnabled', 'push_enabled') === 1,
        record: pickRowNumber(row, 'recordEnabled', 'record_enabled') === 1,
        desktopEnabled,
    }
}

export async function isDesktopNotificationEnabled(
    db: AppDb,
    userId: string
): Promise<boolean> {
    const row = await db.get<Record<string, unknown>>(
        `SELECT push_enabled AS pushEnabled
         FROM user_notification_settings
         WHERE user_id = ? AND notification_setting_id = ?`,
        [userId, DESKTOP_NOTIFICATION_SETTING_ID]
    )
    return pickRowNumber(row, 'pushEnabled', 'push_enabled') === 1
}

export function assertValidSettingPayload(
    settings: Array<{ id?: string; pushEnabled?: boolean; recordEnabled?: boolean }>
): Array<{ id: NotificationSettingId; pushEnabled: boolean; recordEnabled: boolean }> {
    const out: Array<{ id: NotificationSettingId; pushEnabled: boolean; recordEnabled: boolean }> =
        []
    for (const item of settings) {
        const id = String(item.id ?? '').trim()
        if (!isKnownNotificationSettingId(id)) continue
        out.push({
            id,
            pushEnabled: Boolean(item.pushEnabled),
            recordEnabled: Boolean(item.recordEnabled),
        })
    }
    return out
}
