import type { NuxtAxiosInstance } from '@nuxtjs/axios'
import { z } from 'zod'

export const TierSchema = z.object({
  minSpend: z.number(),
  maxSpend: z.number(),
  name: z.string(),
  id: z.number(),
  includeExpiredFans: z.boolean().optional(),
})

export type Tier = z.infer<typeof TierSchema>

export const CreateTierInputSchema = z.object({
  name: z.string(),
  minSpend: z.number(),
  maxSpend: z.number(),
  includeExpiredFans: z.boolean().optional(),
})

export type CreateTierInput = z.infer<typeof CreateTierInputSchema>

export const UpdateTierInputSchema = z.object({
  name: z.string().optional(),
  minSpend: z.number().optional(),
  maxSpend: z.number().optional(),
  includeExpiredFans: z.boolean().optional(),
})

export type UpdateTierInput = z.infer<typeof UpdateTierInputSchema>

export const listTiers = (axios: NuxtAxiosInstance) => (creatorId: number) => {
  return axios
    .$get(`/dashboard/api/v1/${creatorId}/settings/tiers`)
    .then(response => {
      return z.array(TierSchema).parse(response)
    })
}

export const createTier =
  (axios: NuxtAxiosInstance) => (creatorId: number, input: CreateTierInput) => {
    return axios
      .$post(`/dashboard/api/v1/${creatorId}/settings/tier`, input)
      .then(response => TierSchema.parse(response))
  }

export const updateTier =
  (axios: NuxtAxiosInstance) =>
  (creatorId: number, tierId: number, input: UpdateTierInput) => {
    return axios
      .$put(`/dashboard/api/v1/${creatorId}/settings/tier/${tierId}`, input)
      .then(response => TierSchema.parse(response))
  }

export const deleteTier =
  (axios: NuxtAxiosInstance) => (creatorId: number, tierId: number) => {
    return axios.$delete(
      `/dashboard/api/v1/${creatorId}/settings/tier/${tierId}`,
    )
  }
