import { qrDb } from "../dbs";
import type { QRCodeDocument } from "@hereconnect/types";
import { EPOCH } from "@hereconnect/constants";
import { env } from "../config/env"; // Предполагается, что здесь хранится READ_BASE_URL
/**
 * Получает документ QR-кода по его _id.
 * @param qrCodeUri - Идентификатор документа QR-кода
 */
export function getQRCodeByUri(qrCodeUri: string) {
  // Если документ не будет найден, будет брошена ошибка с name === "not_found"
  // или любая другая ошибка будет проброшена дальше, без перехвата.
  return qrDb.get(`qr_code:${qrCodeUri}`);
}

/**
 * Удаляет документ QR-кода по его _id, используя механику _deleted: true.
 * @param qrCodeUri - Идентификатор документа QR-кода.
 */
export async function deleteQRCode(qrCodeUri: string): Promise<void> {
  const doc = await getQRCodeByUri(qrCodeUri);
  if (!doc) {
    throw new Error(`QR-код $(qrCodeUri}" не найден`);
  }

  const deletedDoc = {
    ...doc,
    _deleted: true, // Помечаем документ как удалённый
  };

  await qrDb.put(deletedDoc);
}

/**
 * Возвращает список QR-кодов, принадлежащих данному пользователю.
 * @param userUuid - UUID пользователя
 */
export async function getQRCodesByUser(userUuid: string) {
  const result = await qrDb.find({
    selector: {
      type: "qr_code",
      user_uuid: userUuid,
    },
    limit: Number.MAX_SAFE_INTEGER,
  });

  return result.docs;
}

interface CreateQRCodeOptions {
  userUuid: string;
  name: string;
  placement: QRCodeDocument["placement"];
  actions: QRCodeDocument["actions"];
  messageDeliveryMethod?: QRCodeDocument["messageDeliveryMethod"];
  predefinedMessages?: QRCodeDocument["predefinedMessages"];
  browser_uuid?: string;
  telegram_id?: string;
}

/**
 * Создаёт новый QR-код документ в базе.
 * Генерирует уникальный URI, сохраняет документ и возвращает объект с uri.
 */
export async function createQRCode(options: CreateQRCodeOptions) {
  const now = new Date().toISOString();

  // Генерируем uri на основе текущего времени относительно EPOCH
  const uri = Math.abs(Date.now() - EPOCH).toString(36);
  const url = `${env.READ_BASE_URL}/${uri}`;
  const newDoc: QRCodeDocument = {
    _id: `qr_code:${uri}`,
    type: "qr_code",
    created_at: now,
    user_uuid: options.userUuid,
    name: options.name,
    placement: options.placement,
    actions: options.actions,
    predefinedMessages: options.predefinedMessages,
    uri,
    url,
    messageDeliveryMethod: options.messageDeliveryMethod || "telegram",
    browser_uuid: options.browser_uuid,
    telegram_id: options.telegram_id,
  };

  const resp = await qrDb.put(newDoc);
  if (!resp.ok) {
    throw new Error("Не удалось создать QR-код");
  }

  newDoc._rev = resp.rev;

  return newDoc;
}
