import { usersDb } from "../dbs";
import type { UserDocument } from "@hereconnect/types";
import { getIsoDate } from "../utils/date";
import { randomUUID } from "crypto";

/**
 * Ищет или создаёт пользователя по telegram_id.
 * @param telegramId - числовой Telegram ID
 * @param options - дополнительные поля, например email
 */
export async function getOrCreateUserByTelegramId(
  telegramId: number,
  options?: { email?: string },
): Promise<UserDocument> {
  const docId = `org.couchdb.user:telegram_${telegramId}`;

  // Пытаемся получить пользователя по docId
  let existingUser: UserDocument | undefined;
  try {
    const doc = await usersDb.get<UserDocument>(docId);
    existingUser = doc;
  } catch (error: any) {
    if (error.name !== "not_found") {
      // Если ошибка не "not_found", пробрасываем дальше
      throw error;
    }
    // Если not_found, то пользователя нет, создадим
  }

  if (existingUser) {
    // Пользователь уже существует
    return existingUser;
  }

  // Создаем нового пользователя
  const now = getIsoDate();
  const userUuid = randomUUID();
  const password = randomUUID();

  const newUser: UserDocument = {
    _id: docId,
    type: "user",
    created_at: now,
    telegram_id: telegramId,
    name: `telegram_${telegramId}`,
    user_uuid: userUuid,
    roles: ["user"],
    password,
    email: options?.email,
  };

  // Создаём документ в базе
  const response = await usersDb.put(newUser);
  if (!response.ok) {
    throw new Error("Не удалось создать пользователя (put)");
  }

  // Обновляем _rev
  newUser._rev = response.rev;
  return newUser;
}

/**
 * Гарантирует, что пользователь с указанным Telegram ID существует.
 * Если пользователь не существует, создаёт его. Возвращает документ пользователя.
 * @param telegramId - числовой Telegram ID
 * @param email - дополнительный параметр, если нужно
 */
export async function ensureUserExists(
  telegramId: number,
  email?: string,
): Promise<UserDocument> {
  // Вызов уже реализованной функции getOrCreateUserByTelegramId
  const userDoc = await getOrCreateUserByTelegramId(telegramId, { email });
  return userDoc;
}
