import { router, protectedProcedure, publicProcedure } from "../_core/trpc.ts";
import { z } from "zod";
import { sendEmailVerification, verifyEmailWithToken, getVerificationStatus } from "../services/emailVerification.ts";
import { TRPCError } from "@trpc/server";

export const emailVerificationRouter = router({
  /**
   * Send email verification
   */
  sendVerification: protectedProcedure
    .input(
      z.object({
        email: z.string().email("Invalid email address"),
      })
    )
    .mutation(async ({ ctx, input }) => {
      try {
        const { token, expiresAt } = await sendEmailVerification(ctx.user.id, input.email);

        return {
          success: true,
          message: "Verification email sent",
          expiresAt,
        };
      } catch (error) {
        console.error("[EmailVerification] Error sending verification:", error);
        throw new TRPCError({
          code: "INTERNAL_SERVER_ERROR",
          message: "Failed to send verification email",
        });
      }
    }),

  /**
   * Verify email with token
   */
  verifyToken: publicProcedure
    .input(
      z.object({
        token: z.string().min(1, "Token is required"),
      })
    )
    .mutation(async ({ input }) => {
      try {
        const result = await verifyEmailWithToken(input.token);

        if (!result) {
          throw new TRPCError({
            code: "BAD_REQUEST",
            message: "Invalid or expired verification token",
          });
        }

        return {
          success: true,
          message: "Email verified successfully",
          userId: result.userId,
          email: result.email,
        };
      } catch (error) {
        if (error instanceof TRPCError) throw error;
        console.error("[EmailVerification] Error verifying token:", error);
        throw new TRPCError({
          code: "INTERNAL_SERVER_ERROR",
          message: "Failed to verify email",
        });
      }
    }),

  /**
   * Get verification status
   */
  getStatus: protectedProcedure.query(async ({ ctx }) => {
    try {
      const status = await getVerificationStatus(ctx.user.id);
      return status;
    } catch (error) {
      console.error("[EmailVerification] Error getting status:", error);
      throw new TRPCError({
        code: "INTERNAL_SERVER_ERROR",
        message: "Failed to get verification status",
      });
    }
  }),
});
