import type { B2bPurchaseRequest } from '../api/b2bApi'

// Минимальный объём заявки, ₽.
export const MIN_ORDER = 500_000

// Чем дольше клиент готов ждать исполнения, тем ниже ставка комиссии сервиса.
// days — срок ожидания операции, rate — доля комиссии (0.05 = 5 %).
export const TERM_OPTIONS = [
  { days: 3, rate: 0.05 },
  { days: 4, rate: 0.04636 },
  { days: 5, rate: 0.04273 },
  { days: 6, rate: 0.03909 },
  { days: 7, rate: 0.03545 },
  { days: 8, rate: 0.03182 },
  { days: 9, rate: 0.02818 },
  { days: 10, rate: 0.02455 },
  { days: 11, rate: 0.02091 },
  { days: 12, rate: 0.01727 },
  { days: 13, rate: 0.01364 },
  { days: 14, rate: 0.01 },
] as const

// Целое число с разделителями групп в русской локали: 500000 → "500 000".
export const formatRub = (n: number) =>
  n.toLocaleString('ru-RU', { maximumFractionDigits: 0 })

// Русское склонение слова «день» для срока ожидания.
export function dayLabel(days: number): string {
  const mod10 = days % 10
  const mod100 = days % 100
  if (mod10 === 1 && mod100 !== 11) return `${days} день`
  if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return `${days} дня`
  return `${days} дней`
}

// Ставка комиссии (доля) для выбранного срока. Фоллбэк — ставка первого срока.
export function termRate(days: number): number {
  return TERM_OPTIONS.find((o) => o.days === days)?.rate ?? TERM_OPTIONS[0].rate
}

export interface Quote {
  rate: number // доля комиссии (0.05 = 5 %)
  commission: number // сумма комиссии, ₽
  total: number // сумма к оплате, ₽
}

// Расчёт комиссии и итога по объёму заявки и сроку ожидания.
export function calcQuote(amount: number, days: number): Quote {
  const rate = termRate(days)
  const commission = amount * rate
  return { rate, commission, total: amount + commission }
}

export interface PurchaseCommentParts {
  name: string
  contact: string
  days: number
  amount: number
  commission: number
  total: number
}

// У заявки нет отдельных полей под имя/контакт/срок/суммы в ₽ — всё, что нужно
// менеджеру, упаковывается в человекочитаемый comment. Обратная операция —
// parseContactFromComment.
export function buildPurchaseComment(parts: PurchaseCommentParts): string {
  const { name, contact, days, amount, commission, total } = parts
  return [
    name && `Имя: ${name}`,
    contact && `Контакт: ${contact}`,
    `Срок ожидания: ${dayLabel(days)}`,
    `Сумма: ${formatRub(amount)} ₽`,
    `Комиссия: ≈${formatRub(commission)} ₽`,
    `Итого: ≈${formatRub(total)} ₽`,
  ]
    .filter(Boolean)
    .join('; ')
}

// Достаёт имя и контакт из comment последней заявки для автозаполнения формы.
export function parseContactFromComment(comment: string | null): {
  name: string
  contact: string
} {
  return {
    name: comment?.match(/Имя:\s*([^;]+)/)?.[1]?.trim() ?? '',
    contact: comment?.match(/Контакт:\s*([^;]+)/)?.[1]?.trim() ?? '',
  }
}

// Последняя по времени создания заявка на аккаунте, либо null.
export function latestPurchaseRequest(
  items: B2bPurchaseRequest[],
): B2bPurchaseRequest | null {
  return items.reduce<B2bPurchaseRequest | null>(
    (latest, r) =>
      !latest || (r.created_at ?? '') > (latest.created_at ?? '') ? r : latest,
    null,
  )
}
