import { z } from "zod"

import * as api from "@/lib/api"
import { protectedProcedure } from "@/server/trpc"

import { getOTPState } from "./otp/getOTPState"
import { getSasToken } from "./getSasToken"

const outputSchema = z.object({
  linkingState: z.enum(["unlinked", "notLinked", "error"]),
})

export const unlinkAccount = protectedProcedure
  .output(outputSchema)
  .mutation(async function ({ ctx }) {
    const sasAuthToken = await getSasToken()
    const { referenceId } = await getOTPState()

    const apiResponse = await api.post(api.endpoints.v1.Profile.unlink, {
      headers: {
        Authorization: `Bearer ${ctx.session.token.access_token}`,
      },
      body: {
        partner: "sas_eb",
        partnerSpecific: {
          eurobonusAccessToken: sasAuthToken,
          eurobonusOtpReferenceId: referenceId,
        },
      },
    })

    if (apiResponse.status === 204 || apiResponse.status === 202) {
      console.log("[SAS] unlink account success")
      return { linkingState: "unlinked" }
    }

    if (apiResponse.status === 400) {
      const result = await apiResponse.json()

      console.log("[SAS] unlink account error with response", result)
      return { linkingState: "error" }
    }

    if (apiResponse.status === 404) {
      console.log("[SAS] tried unlinking an account that was not linked")
      return { linkingState: "notLinked" }
    }

    console.log(
      `[SAS] unlink account error with status code ${apiResponse.status} and response ${await apiResponse.text()}`
    )
    return { linkingState: "error" }
  })
