import { addOrganizationWords, consumeOrganizationWords, getOrganizationBalance } from 'services/words'
import { authorize } from 'utils/authorization'
import { lfunction } from 'utils/aws'
import { HttpError } from 'utils/error'
import { deserialize } from 'utils/http'
import { z } from 'zod'

export const balance = lfunction(async (event) => {
    const authorization = await authorize(event)
    if (!authorization.organizationIdentity) {
        throw new Error('Organization not found')
    }

    const balance = await getOrganizationBalance(authorization.organizationIdentity)
    return { balance }
})

const zAddWord = z.object({
    id: z.string(),
    words: z.number(),
    expiration: z.date().optional(),
})

export const addWords = lfunction(async (event) => {
    const authorization = await authorize(event)

    if (authorization.role !== 'admin') {
        throw new HttpError(403, 'Forbidden')
    }

    if (!authorization.organizationIdentity) {
        throw new Error('Organization not found')
    }

    const addWordsPayload = deserialize(event, zAddWord)
    if (addWordsPayload.words > 0) {
        await addOrganizationWords({
            id: addWordsPayload.id,
            organizationIdentity: authorization.organizationIdentity,
            words: addWordsPayload.words,
            expiration: addWordsPayload.expiration,
        })
    } else {
        await consumeOrganizationWords(authorization.organizationIdentity, addWordsPayload.words)
    }
})
