import { getDb } from "./db.ts";
import { users, wallets, transactions } from "../drizzle/schema.ts";
import { eq } from "drizzle-orm";

const WELCOME_BONUS_AMOUNT = 10; // SC coins

/**
 * Claim welcome bonus for a user
 */
export async function claimWelcomeBonus(userId: number) {
  const db = await getDb();
  if (!db) return { success: false, message: "Database connection failed" };

  try {
    // Check if user exists
    const user = await db.select({
      id: users.id,
      openId: users.openId,
      name: users.name,
      email: users.email,
      loginMethod: users.loginMethod,
      role: users.role,
      createdAt: users.createdAt,
      updatedAt: users.updatedAt,
      lastSignedIn: users.lastSignedIn,
    }).from(users).where(eq(users.id, userId)).limit(1);
    if (!user.length) {
      return { success: false, message: "User not found" };
    }

    // Get current wallet balance
    const wallet = await db.select().from(wallets).where(eq(wallets.userId, userId)).limit(1);
    if (!wallet.length) {
      return { success: false, message: "Wallet not found" };
    }

    const currentBalance = parseFloat(wallet[0].scBalance || "0");
    const newBalance = currentBalance + WELCOME_BONUS_AMOUNT;

    // Update wallet
    await db.update(wallets).set({ scBalance: newBalance.toString() }).where(eq(wallets.userId, userId));

    // Log transaction
    await db.insert(transactions).values({
      userId,
      type: "sc_bonus" as any,
      currency: "SC",
      amount: WELCOME_BONUS_AMOUNT.toString(),
      description: "Welcome bonus claimed",
      balanceBefore: currentBalance.toString(),
      balanceAfter: newBalance.toString(),
    });

    return { success: true, message: `Welcome bonus of ${WELCOME_BONUS_AMOUNT} SC credited!` };
  } catch (error) {
    console.error("Error claiming welcome bonus:", error);
    return { success: false, message: "Failed to claim welcome bonus" };
  }
}

/**
 * Auto-credit welcome bonus on phone+email verification
 */
export async function autoCreditWelcomeBonus(userId: number) {
  const db = await getDb();
  if (!db) return;

  const user = await db.select({
    id: users.id,
    openId: users.openId,
    name: users.name,
    email: users.email,
    loginMethod: users.loginMethod,
    role: users.role,
    createdAt: users.createdAt,
    updatedAt: users.updatedAt,
    lastSignedIn: users.lastSignedIn,
  }).from(users).where(eq(users.id, userId)).limit(1);
  if (!user.length) {
    return;
  }

  const currentUser = user[0];

  // Check if both email is verified
  const emailVerified = currentUser.email !== null && currentUser.email !== "";

  if (!emailVerified) {
    return;
  }

  try {
    // Credit wallet
    const wallet = await db.select().from(wallets).where(eq(wallets.userId, userId)).limit(1);
    if (!wallet.length) {
      return;
    }

    const scBefore = parseFloat(wallet[0].scBalance || "0");
    const scAfter = scBefore + WELCOME_BONUS_AMOUNT;

    // Update wallet
    await db.update(wallets).set({ scBalance: scAfter.toString() }).where(eq(wallets.userId, userId));

    // Log transaction for SC bonus
    await db.insert(transactions).values({
      userId,
      type: "sc_bonus" as any,
      currency: "SC",
      amount: WELCOME_BONUS_AMOUNT.toString(),
      description: "Auto-credited welcome bonus",
      balanceBefore: scBefore.toString(),
      balanceAfter: scAfter.toString(),
    });

    console.log(`Welcome bonus auto-credited to user ${userId}`);
  } catch (error) {
    console.error("Error auto-crediting welcome bonus:", error);
  }
}
