import { AppError } from "./errors.js";
import { supabaseAdmin } from "./supabase.js";

export async function resolveOrganizationLimits(_client: unknown, organizationId: string) {
  const { data, error } = await supabaseAdmin
    .from("organization_subscriptions")
    .select("plan_definitions(code, contact_limit, monthly_email_limit)")
    .eq("organization_id", organizationId)
    .eq("status", "active")
    .order("created_at", { ascending: false })
    .limit(1)
    .single();

  if (error || !data) {
    throw new AppError(500, "PLAN_LOOKUP_FAILED", error?.message ?? "No active plan is configured.");
  }

  const plan = Array.isArray(data.plan_definitions) ? data.plan_definitions[0] : data.plan_definitions;

  return {
    planCode: String(plan?.code ?? "free"),
    contactLimit: (plan?.contact_limit as number | null) ?? null,
    monthlyEmailLimit: (plan?.monthly_email_limit as number | null) ?? null,
  };
}

export async function getCurrentUsage(_client: unknown, organizationId: string) {
  const periodStart = new Date();
  periodStart.setUTCDate(1);
  periodStart.setUTCHours(0, 0, 0, 0);
  const periodKey = periodStart.toISOString().slice(0, 10);

  const { data: existing, error } = await supabaseAdmin
    .from("monthly_usage_counters")
    .select("*")
    .eq("organization_id", organizationId)
    .eq("period_start", periodKey)
    .maybeSingle();

  if (error) {
    throw new AppError(500, "USAGE_LOOKUP_FAILED", error.message);
  }

  if (existing) {
    return {
      id: existing.id as string,
      period_start: periodKey,
      contacts_count: Number(existing.contacts_count ?? 0),
      emails_sent: Number(existing.emails_sent_count ?? 0),
      emails_sent_count: Number(existing.emails_sent_count ?? 0),
    };
  }

  const { data, error: insertError } = await supabaseAdmin
    .from("monthly_usage_counters")
    .insert({
      organization_id: organizationId,
      period_start: periodKey,
      contacts_count: 0,
      emails_sent_count: 0,
    })
    .select("*")
    .single();

  if (insertError || !data) {
    throw new AppError(500, "USAGE_LOOKUP_FAILED", insertError?.message ?? "Unable to initialize usage.");
  }

  return {
    id: data.id as string,
    period_start: periodKey,
    contacts_count: 0,
    emails_sent: 0,
    emails_sent_count: 0,
  };
}
