import { prisma } from '../../config/database.js';
import { replyToComment } from '../instagram/graph-api.service.js';
import { logger } from '../../utils/logger.js';

// Load translations
import trMessages from '../../i18n/tr.json' assert { type: 'json' };

type IgReplyKey = keyof typeof trMessages.ig_reply;

function formatReply(templateKey: IgReplyKey, vars: Record<string, string | number>): string {
  let text: string = trMessages.ig_reply[templateKey] ?? '';
  for (const [key, val] of Object.entries(vars)) {
    text = text.replaceAll(`{${key}}`, String(val));
  }
  return text;
}

/**
 * Reply to an IG comment when a claim ("aldım") adds item to cart.
 */
export async function replyCartAdded(
  tenantId: string,
  commentId: string,
  igUsername: string,
): Promise<void> {
  try {
    const tenant = await prisma.tenant.findUnique({
      where: { id: tenantId },
      select: { igAccessToken: true, settings: true, domain: true },
    });

    if (!tenant?.igAccessToken) return;

    const settings = (tenant.settings ?? {}) as Record<string, any>;
    if (settings.autoReplyEnabled === false) return;

    const cartUrl = tenant.domain
      ? `https://${tenant.domain}/sepet`
      : 'sitemiz';

    const message = formatReply('cart_added', {
      username: igUsername,
      cart_url: cartUrl,
    });

    await replyToComment(commentId, message, tenant.igAccessToken);
    logger.info({ tenantId, commentId, igUsername }, '[IG-Reply] Cart added reply sent');
  } catch (err) {
    logger.error({ err, tenantId, commentId }, '[IG-Reply] Failed to send cart added reply');
  }
}

/**
 * Reply to an IG comment when a bid is accepted in auction mode.
 */
export async function replyBidAccepted(
  tenantId: string,
  commentId: string,
  igUsername: string,
  amount: number,
  highestBid: number,
): Promise<void> {
  try {
    const tenant = await prisma.tenant.findUnique({
      where: { id: tenantId },
      select: { igAccessToken: true, settings: true },
    });

    if (!tenant?.igAccessToken) return;

    const settings = (tenant.settings ?? {}) as Record<string, any>;
    if (settings.autoReplyEnabled === false) return;

    const message = formatReply('bid_accepted', {
      username: igUsername,
      amount,
      highest: highestBid,
    });

    await replyToComment(commentId, message, tenant.igAccessToken);
    logger.info({ tenantId, commentId, igUsername, amount }, '[IG-Reply] Bid accepted reply sent');
  } catch (err) {
    logger.error({ err, tenantId, commentId }, '[IG-Reply] Failed to send bid accepted reply');
  }
}

/**
 * Reply to an IG comment when stock is exhausted (waitlist).
 */
export async function replyStockOut(
  tenantId: string,
  commentId: string,
  igUsername: string,
): Promise<void> {
  try {
    const tenant = await prisma.tenant.findUnique({
      where: { id: tenantId },
      select: { igAccessToken: true, settings: true },
    });

    if (!tenant?.igAccessToken) return;

    const settings = (tenant.settings ?? {}) as Record<string, any>;
    if (settings.autoReplyEnabled === false) return;

    const message = formatReply('stock_out', { username: igUsername });

    await replyToComment(commentId, message, tenant.igAccessToken);
    logger.info({ tenantId, commentId, igUsername }, '[IG-Reply] Stock out reply sent');
  } catch (err) {
    logger.error({ err, tenantId, commentId }, '[IG-Reply] Failed to send stock out reply');
  }
}
