import { getSetting } from '../db.js';

// --- Извлечение значения поля вида "Label: value" из тела письма ---
function field(text, label) {
  // экранируем спецсимволы метки. Пробелы вокруг двоеточия и значение берём
  // только в пределах ОДНОЙ строки ([^\S\r\n] = пробел/таб, но не перенос),
  // иначе для пустого поля (напр. "Position:") значение «перепрыгнет» на след. строку.
  const escaped = label.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  const re = new RegExp(`${escaped}[^\\S\\r\\n]*:[^\\S\\r\\n]*(.*)`, 'i');
  const m = text.match(re);
  return m ? m[1].trim() : '';
}

// Разбор анкеты в структуру. Возвращает поля, которые нам нужны.
export function parseForm(text) {
  const body = String(text || '');
  // E-mail может быть подписан как "E-mail" или "Email"
  const email = field(body, 'E-mail') || field(body, 'Email');
  return {
    country: field(body, 'Country'),
    firstName: field(body, 'First Name'),
    lastName: field(body, 'Last Name'),
    email,
    position: field(body, 'Position'),
    employmentRaw: field(body, 'Employment desired'),
    employment: normalizeEmployment(field(body, 'Employment desired')),
  };
}

// "Full time" / "Part-Time" / "fulltime" → 'full' | 'part' | null
export function normalizeEmployment(value) {
  const v = String(value || '').toLowerCase().replace(/[\s\-_]/g, '');
  if (v.includes('fulltime') || v === 'full') return 'full';
  if (v.includes('parttime') || v === 'part') return 'part';
  return null;
}

// Получить строку ставки по коду страны и типу занятости.
// Страны нет в таблице → запись default. Возвращает строку (напр. "2100 PHP/hour").
export function lookupRate(country, employment) {
  let table = {};
  try {
    table = JSON.parse(getSetting('rate_table') || '{}');
  } catch {
    table = {};
  }
  const code = String(country || '').trim().toUpperCase();
  const entry = table[code] || table.default || {};
  return employment === 'full' ? (entry.full || '') : (entry.part || '');
}

// Подстановка плейсхолдеров в шаблон.
export function renderTemplate(template, vars) {
  return String(template || '').replace(/\{(\w+)\}/g, (_, key) =>
    vars[key] != null ? String(vars[key]) : ''
  );
}

// Является ли письмо анкетой — по домену отправителя.
export function isApplicationEmail(fromAddress) {
  const domain = (getSetting('apply_domain') || '').trim().toLowerCase();
  if (!domain) return false;
  return String(fromAddress || '').toLowerCase().includes(`@${domain}`)
    || String(fromAddress || '').toLowerCase().endsWith(domain);
}

// Полная обработка анкеты: парсинг → выбор шаблона → подстановка.
// Возвращает { ok, to, body, parsed, rate, warnings }.
export function processApplication({ body, subject } = {}) {
  const parsed = parseForm(body);
  const warnings = [];

  if (!parsed.email) warnings.push('Не найден E-mail в анкете — некуда отправлять ответ');
  if (!parsed.employment) {
    warnings.push('Не удалось определить Full/Part-Time (поле "Employment desired")');
  }

  const rate = parsed.employment ? lookupRate(parsed.country, parsed.employment) : '';
  const usedDefault = (() => {
    let table = {};
    try { table = JSON.parse(getSetting('rate_table') || '{}'); } catch { /* ignore */ }
    const code = String(parsed.country || '').trim().toUpperCase();
    return !table[code];
  })();
  if (usedDefault && parsed.country) {
    warnings.push(`Страна "${parsed.country}" не в таблице — применена ставка default (USD)`);
  }

  let replyBody = '';
  if (parsed.employment) {
    const template = parsed.employment === 'full'
      ? getSetting('template_fulltime')
      : getSetting('template_parttime');
    replyBody = renderTemplate(template, {
      first_name: parsed.firstName,
      last_name: parsed.lastName,
      country: parsed.country,
      position: parsed.position,
      rate,
      employment: parsed.employment === 'full' ? 'Full-Time' : 'Part-Time',
    });
  }

  return {
    ok: !!parsed.email && !!parsed.employment,
    to: parsed.email,
    subject: subject ? `Re: ${subject}` : '',
    body: replyBody,
    parsed,
    rate,
    warnings,
  };
}
