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

type ActivityMetadata = Record<string, unknown>;

type CampaignActivityInput = {
  organizationId: string;
  campaignId?: string | null;
  campaignSendId?: string | null;
  actorAuthUserId?: string | null;
  action: string;
  metadata?: ActivityMetadata;
  createdAt?: string;
};

type ContactActivityInput = {
  organizationId: string;
  contactId?: string | null;
  importJobId?: string | null;
  actorAuthUserId?: string | null;
  action: string;
  metadata?: ActivityMetadata;
  createdAt?: string;
};

function normalizeMetadata(metadata?: ActivityMetadata) {
  return metadata ?? {};
}

export async function logCampaignActivity(input: CampaignActivityInput) {
  const { error } = await supabaseAdmin
    .from("campaign_activity_logs")
    .insert({
      organization_id: input.organizationId,
      campaign_id: input.campaignId ?? null,
      campaign_send_id: input.campaignSendId ?? null,
      actor_auth_user_id: input.actorAuthUserId ?? null,
      action: input.action,
      metadata: normalizeMetadata(input.metadata),
      created_at: input.createdAt ?? isoNow(),
    });

  if (error) {
    throw new AppError(400, "CAMPAIGN_ACTIVITY_LOG_FAILED", error.message);
  }
}

export async function logContactActivity(input: ContactActivityInput) {
  const { error } = await supabaseAdmin
    .from("contact_activity_logs")
    .insert({
      organization_id: input.organizationId,
      contact_id: input.contactId ?? null,
      import_job_id: input.importJobId ?? null,
      actor_auth_user_id: input.actorAuthUserId ?? null,
      action: input.action,
      metadata: normalizeMetadata(input.metadata),
      created_at: input.createdAt ?? isoNow(),
    });

  if (error) {
    throw new AppError(400, "CONTACT_ACTIVITY_LOG_FAILED", error.message);
  }
}

export async function logContactActivities(inputs: ContactActivityInput[]) {
  if (!inputs.length) return;

  const { error } = await supabaseAdmin
    .from("contact_activity_logs")
    .insert(
      inputs.map((input) => ({
        organization_id: input.organizationId,
        contact_id: input.contactId ?? null,
        import_job_id: input.importJobId ?? null,
        actor_auth_user_id: input.actorAuthUserId ?? null,
        action: input.action,
        metadata: normalizeMetadata(input.metadata),
        created_at: input.createdAt ?? isoNow(),
      }))
    );

  if (error) {
    throw new AppError(400, "CONTACT_ACTIVITY_LOG_FAILED", error.message);
  }
}
