export type RoomStreamCategory = {
    groupId: string
    itemId: string
}

const VALID_GROUPS = new Set(['life', 'game', 'talk'])
const VALID_ITEMS: Record<string, Set<string>> = {
    life: new Set(['hobby', 'daily']),
    game: new Set(['fps', 'moba']),
    talk: new Set(['chat', 'radio']),
}

export function isValidRoomStreamCategory(
    value: RoomStreamCategory | null | undefined
): value is RoomStreamCategory {
    if (!value?.groupId || !VALID_GROUPS.has(value.groupId)) return false
    const itemId = String(value.itemId ?? '').trim()
    if (!itemId) return false
    return VALID_ITEMS[value.groupId]?.has(itemId) ?? false
}

export function parseRoomStreamCategory(raw: unknown): RoomStreamCategory | null {
    if (raw == null || raw === '') return null
    if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {
        const o = raw as Record<string, unknown>
        const parsed = {
            groupId: String(o.groupId ?? '').trim(),
            itemId: String(o.itemId ?? '').trim(),
        }
        return isValidRoomStreamCategory(parsed) ? parsed : null
    }
    const str = String(raw).trim()
    if (!str) return null
    try {
        const parsed = JSON.parse(str) as unknown
        if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
            const o = parsed as Record<string, unknown>
            const cat = {
                groupId: String(o.groupId ?? '').trim(),
                itemId: String(o.itemId ?? '').trim(),
            }
            return isValidRoomStreamCategory(cat) ? cat : null
        }
    } catch {
        // legacy "group:item" or group only
        const [groupId, itemId = ''] = str.split(':').map((s) => s.trim())
        const cat = { groupId, itemId }
        return isValidRoomStreamCategory(cat) ? cat : null
    }
    return null
}

export function serializeRoomStreamCategory(
    category: RoomStreamCategory | null | undefined
): string {
    if (!isValidRoomStreamCategory(category)) return ''
    return JSON.stringify({ groupId: category.groupId, itemId: category.itemId })
}

/** 探索／列表 API：依主分類 groupId 比對 */
export function roomStreamCategoryMatchesGroup(
    stored: string | null | undefined,
    groupId: string
): boolean {
    const cat = parseRoomStreamCategory(stored)
    return cat?.groupId === groupId
}

export function roomStreamCategoryToTagIds(
    stored: string | null | undefined
): string[] {
    const cat = parseRoomStreamCategory(stored)
    if (!cat) return []
    return [cat.groupId, cat.itemId]
}

export type RoomStreamCategoryLabels = {
    groupId: string
    itemId: string
    groupLabel: string
    itemLabel: string
}

/** 儀表板／直播間說明欄共用之分類文案 */
export function resolveRoomStreamCategoryLabels(
    category: RoomStreamCategory | null | undefined,
    t: (key: string, options?: Record<string, unknown>) => string
): RoomStreamCategoryLabels | null {
    if (!isValidRoomStreamCategory(category)) return null
    const itemKey = `${category.groupId}_${category.itemId}`
    return {
        groupId: category.groupId,
        itemId: category.itemId,
        groupLabel: t(`dashboard.fields.category.groups.${category.groupId}`),
        itemLabel: t(`dashboard.fields.category.items.${itemKey}`),
    }
}
