import PocketBase, { RecordModel } from "pocketbase";

const isServer = typeof window === "undefined";

const publicUrl =
  process.env.NEXT_PUBLIC_PB_URL || "https://netrunner-vpn.com/cms-api";
const internalUrl = process.env.PB_INTERNAL_URL; // Не ставим дефолт здесь

export const PB_URL = isServer ? internalUrl || publicUrl : publicUrl;

export const pb = new PocketBase(PB_URL);

// Отключаем автоотмену на сервере, чтобы избежать AbortError при SSR/ISR
if (isServer) {
  pb.autoCancellation(false);
}

if (typeof window !== "undefined") {
  // Фильтруем ошибки абортов (CANCELLED), которые генерит PocketBase
  const originalError = console.error;
  console.error = (...args) => {
    if (args[0]?.message?.includes("The request was autocancelled")) return;
    originalError.apply(console, args);
  };
}

/**
 * Базовый интерфейс для записей PocketBase.
 * Наследуемся от RecordModel, чтобы иметь системные поля (id, created, updated, и т.д.)
 */
export interface BaseRecord extends RecordModel {
  id: string;
  collectionId: string;
  collectionName: string;
  created: string;
  updated: string;
}

/**
 * Типизация для постов блога
 */
export interface PBPost extends BaseRecord {
  title: string;
  slug: string;
  excerpt: string;
  content: string;
  image: string; // имя файла
  lang: "ru" | "en";
  published: boolean;
}

/**
 * Типизация для FAQ
 */
export interface PBFaq extends BaseRecord {
  question: string;
  answer: string;
  order: number;
  lang: string;
}

const FILE_BASE_URL =
  process.env.NEXT_PUBLIC_PB_URL || "https://netrunner-vpn.com/cms-api";

/**
 * Функция для генерации ссылки на картинку из PB
 * @param record - Объект записи (должен содержать id и collectionId)
 * @param filename - Имя файла из поля записи
 */
export function getPbImage(
  record: Pick<BaseRecord, "id" | "collectionId">,
  filename: string | undefined,
): string {
  if (!filename) return "";
  return `${FILE_BASE_URL}/api/files/${record.collectionId}/${record.id}/${filename}`;
}
/**
 * Типизация для карточек платформ на странице /download (коллекции downloads_en/downloads_ru)
 */
export interface PBDownload extends BaseRecord {
  name: string; // Имя (напр. "Windows 11")
  platformId: "windows" | "android" | "linux" | "macos" | "ios"; // Строгий ID для иконок
  version: string; // Строка версии
  status: "active" | "dev"; // Статус разработки
  file: string; // Сам бинарник (файл)
  storeLink: string; // URL на магазин или github
  order: number; // Для сортировки (1, 2, 3...)
}

// Идентична getPbImage по формуле URL, но семантически отдельная функция для
// бинарников (используется с атрибутом download на странице /download), а не картинок.
// baseUrl передаётся явно (а не берётся из FILE_BASE_URL), т.к. единственный вызывающий —
// download-client.tsx, "use client"-компонент, которому runtime-адрес PocketBase приходит
// пропсом из серверного page.tsx (см. app/[lang]/download/page.tsx).
export function getPbFileUrl(
  record: Pick<BaseRecord, "id" | "collectionId">,
  filename: string | undefined,
  baseUrl: string,
): string {
  if (!filename) return "";
  return `${baseUrl}/api/files/${record.collectionId}/${record.id}/${filename}`;
}
