import { promises as fs } from "fs";
import path from "path";
import { isMariaDbEnabled } from "@/lib/db/config";
import {
  loadProviderPostStatsFromDb,
  recordProviderPostFailureToDb,
  recordProviderPostSuccessToDb,
} from "@/lib/db/repositories/provider-stats-repo";

const STATS_FILE = path.join(process.cwd(), "data", "provider-post-stats.json");

export interface ProviderPostStats {
  projectId: string;
  platform: string;
  lastSuccessAt?: string;
  successCount: number;
  lastFailureAt?: string;
  failureCount: number;
  lastError?: string;
  lastPostId?: string;
  lastPermalink?: string;
}

type StatsStore = ProviderPostStats[];

async function readStore(): Promise<StatsStore> {
  try {
    const raw = await fs.readFile(STATS_FILE, "utf-8");
    return JSON.parse(raw) as StatsStore;
  } catch {
    return [];
  }
}

async function writeStore(store: StatsStore) {
  await fs.mkdir(path.dirname(STATS_FILE), { recursive: true });
  await fs.writeFile(STATS_FILE, JSON.stringify(store, null, 2), "utf-8");
}

export async function loadProviderPostStats(projectId: string): Promise<ProviderPostStats[]> {
  if (isMariaDbEnabled()) {
    try {
      return await loadProviderPostStatsFromDb(projectId);
    } catch (err) {
      console.error("[PostSync] MariaDB loadProviderPostStats failed — JSON fallback:", err);
    }
  }
  const store = await readStore();
  return store.filter((s) => s.projectId === projectId);
}

export async function recordProviderPostSuccess(input: {
  projectId: string;
  platform: string;
  postId?: string;
  permalink?: string;
}): Promise<ProviderPostStats> {
  if (isMariaDbEnabled()) {
    try {
      return await recordProviderPostSuccessToDb(input);
    } catch (err) {
      console.error("[PostSync] MariaDB recordProviderPostSuccess failed — JSON fallback:", err);
    }
  }

  const store = await readStore();
  const now = new Date().toISOString();
  const index = store.findIndex(
    (s) => s.projectId === input.projectId && s.platform === input.platform,
  );

  const record: ProviderPostStats =
    index === -1
      ? {
          projectId: input.projectId,
          platform: input.platform,
          successCount: 1,
          failureCount: 0,
          lastSuccessAt: now,
          lastPostId: input.postId,
          lastPermalink: input.permalink,
        }
      : {
          ...store[index],
          successCount: store[index].successCount + 1,
          lastSuccessAt: now,
          lastPostId: input.postId,
          lastPermalink: input.permalink,
        };

  if (index === -1) store.push(record);
  else store[index] = record;

  await writeStore(store);
  return record;
}

export async function recordProviderPostFailure(input: {
  projectId: string;
  platform: string;
  error: string;
}): Promise<ProviderPostStats> {
  if (isMariaDbEnabled()) {
    try {
      return await recordProviderPostFailureToDb(input);
    } catch (err) {
      console.error("[PostSync] MariaDB recordProviderPostFailure failed — JSON fallback:", err);
    }
  }

  const store = await readStore();
  const now = new Date().toISOString();
  const index = store.findIndex(
    (s) => s.projectId === input.projectId && s.platform === input.platform,
  );

  const record: ProviderPostStats =
    index === -1
      ? {
          projectId: input.projectId,
          platform: input.platform,
          successCount: 0,
          failureCount: 1,
          lastFailureAt: now,
          lastError: input.error,
        }
      : {
          ...store[index],
          failureCount: store[index].failureCount + 1,
          lastFailureAt: now,
          lastError: input.error,
        };

  if (index === -1) store.push(record);
  else store[index] = record;

  await writeStore(store);
  return record;
}
