import type { ISettings } from "@/models/settings.model";
import { resolveStripeCredentials } from "@/lib/credentials";

export interface POSSoundSettings {
  enabled: boolean;
  volume: number;
  addToCart: boolean;
  orderComplete: boolean;
  payment: boolean;
  error: boolean;
}

export interface POSSettings {
  taxRate: number;
  currency: string;
  locale: string;
  storeName?: string;
  storePhone?: string;
  storeEmail?: string;
  storeAddress?: string;
  storeDomain?: string;
  paymentMethods: string[];
  stripe?: {
    enabled: boolean;
    configured: boolean;
    publishableKey?: string;
  };
  posLocationId?: string;
  /**
   * Whether the register may sell vendor-owned stock. Drives both the query and
   * whether the source/vendor filters are worth showing at all.
   */
  vendorProductsEnabled: boolean;
  printedReceiptsEnabled?: boolean;
  receiptPrinter?: string;
  sound?: POSSoundSettings;
}

/**
 * Consignment selling is a marketplace-only arrangement and is opt-in, so both
 * switches have to be on. Callers that build the product query and the ones
 * that render the filters must agree, hence the single helper.
 */
export function posVendorProductsEnabled(settings: ISettings): boolean {
  return Boolean(
    settings.multiVendorMode?.enabled && settings.pos?.allowVendorProducts,
  );
}

export function buildPOSSettings(settings: ISettings): POSSettings {
  const customize = settings.pos?.customize;
  const stripeCredentials = resolveStripeCredentials(settings.payment?.stripe);
  const stripeEnabled = Boolean(settings.payment?.stripe?.enabled);
  return {
    taxRate: settings.orders?.taxRate ?? 0,
    currency: settings.general?.defaultCurrency ?? "USD",
    locale: settings.general?.defaultLanguage ?? "en",
    storeName: settings.general?.storeName ?? "Store",
    storePhone: settings.general?.storePhone ?? "",
    storeEmail: settings.general?.storeEmail ?? "",
    storeAddress: settings.general?.storeAddress ?? "",
    storeDomain: settings.general?.storeDomain ?? "",
    paymentMethods: settings.pos?.checkout?.paymentMethods ?? ["cash", "card"],
    stripe: {
      enabled: stripeEnabled,
      configured: stripeEnabled && Boolean(stripeCredentials.secretKey),
      publishableKey: stripeCredentials.publishableKey,
    },
    posLocationId: settings.pos?.defaultPosLocationId,
    vendorProductsEnabled: posVendorProductsEnabled(settings),
    printedReceiptsEnabled: customize?.printedReceiptsEnabled ?? false,
    receiptPrinter: customize?.receiptPrinter ?? "",
    sound: {
      enabled: customize?.soundEnabled ?? true,
      volume: customize?.soundVolume ?? 50,
      addToCart: customize?.soundAddToCart ?? true,
      orderComplete: customize?.soundOrderComplete ?? true,
      payment: customize?.soundPayment ?? true,
      error: customize?.soundError ?? true,
    },
  };
}
