import type { DatabaseSync } from 'node:sqlite';
import { ensureFeed, fetchAndStore } from './ingest.ts';
import type { UrlGuard } from './ingest.ts';
import {
  subscribe,
  unsubscribe,
  listSubscriptions,
  isSubscribed,
} from '../db/repos/subscriptions.ts';
import type { SubscriptionWithFeed } from '../db/repos/subscriptions.ts';
import { getFeedById } from '../db/repos/feeds.ts';
import type { FeedRow } from '../types/db.js';

export async function addSubscription(
  db: DatabaseSync,
  userId: number,
  inputUrl: string,
  guard?: UrlGuard,
): Promise<FeedRow | null> {
  const feed = await ensureFeed(db, inputUrl, guard);
  if (!feed) return null;
  subscribe(db, userId, feed.id);
  // initial fetch
  await fetchAndStore(db, feed, guard);
  return getFeedById(db, feed.id);
}

export function removeSubscription(db: DatabaseSync, userId: number, feedId: number): void {
  unsubscribe(db, userId, feedId);
}

export function listUserSubscriptions(db: DatabaseSync, userId: number): SubscriptionWithFeed[] {
  return listSubscriptions(db, userId);
}

export function userOwnsSubscription(db: DatabaseSync, userId: number, feedId: number): boolean {
  return isSubscribed(db, userId, feedId);
}
