import { TRPCError } from "@trpc/server"
import { z } from "zod"

import { Lang } from "@/constants/languages"
import { getVerifiedUser } from "@/server/routers/user/utils"
import { safeProtectedProcedure } from "@/server/trpc"

import { isValidSession } from "@/utils/session"

import { getPrimaryLinks } from "./getPrimaryLinks"
import { getSecondaryLinks } from "./getSecondaryLinks"

import type { MyPagesLink } from "./MyPagesLink"

export const myPagesNavigation = safeProtectedProcedure
  .input(
    z.object({
      lang: z.nativeEnum(Lang).optional(),
    })
  )
  .query(
    async ({
      ctx,
      input,
    }): Promise<{
      primaryLinks: MyPagesLink[]
      secondaryLinks: MyPagesLink[]
    } | null> => {
      if (!isValidSession(ctx.session)) {
        return null
      }

      const lang = input.lang || ctx.lang

      if (!lang) {
        throw new TRPCError({
          code: "BAD_REQUEST",
          message: "Language must be provided.",
        })
      }

      const user = await getVerifiedUser({ session: ctx.session })
      if (!user || user.error) {
        return null
      }

      const [primaryLinks, secondaryLinks] = await Promise.all([
        getPrimaryLinks({ lang, userLoyalty: user.data.loyalty }),
        getSecondaryLinks({ lang }),
      ])

      return {
        primaryLinks,
        secondaryLinks,
      }
    }
  )
