/**
 * Утилиты для работы с возрастом в WitLab Funnel
 * 
 * Функции для расчета возраста из даты рождения и создания возрастных групп
 * для использования в системе вариативности воронки
 */

// 🎂 ВОЗРАСТНЫЕ ГРУППЫ для маркетинга и персонализации
export const AGE_GROUPS = [
  { id: "18-21", name: "18-21 год", min: 18, max: 21, description: "Студенческий возраст" },
  { id: "22-25", name: "22-25 лет", min: 22, max: 25, description: "Молодые профессионалы" },
  { id: "26-30", name: "26-30 лет", min: 26, max: 30, description: "Карьерный рост" },
  { id: "31-35", name: "31-35 лет", min: 31, max: 35, description: "Становление личности" },
  { id: "36-40", name: "36-40 лет", min: 36, max: 40, description: "Зрелость и стабильность" },
  { id: "41-45", name: "41-45 лет", min: 41, max: 45, description: "Средний возраст" },
  { id: "46-50", name: "46-50 лет", min: 46, max: 50, description: "Жизненный опыт" },
  { id: "51-60", name: "51-60 лет", min: 51, max: 60, description: "Зрелые отношения" },
  { id: "60+", name: "60+ лет", min: 60, max: 120, description: "Золотой возраст" },
] as const;

// 🎯 МИЛЛЕНИАЛЫ, ПОКОЛЕНИЯ для маркетинговой сегментации
export const GENERATION_GROUPS = [
  { id: "gen-z", name: "Поколение Z", minYear: 1997, maxYear: 2012, description: "Цифровые аборигены" },
  { id: "millennials", name: "Миллениалы", minYear: 1981, maxYear: 1996, description: "Поколение интернета" },
  { id: "gen-x", name: "Поколение X", minYear: 1965, maxYear: 1980, description: "Поколение перемен" },
  { id: "boomers", name: "Бумеры", minYear: 1946, maxYear: 1964, description: "Послевоенное поколение" },
  { id: "silent", name: "Молчаливое поколение", minYear: 1928, maxYear: 1945, description: "Довоенное поколение" },
] as const;

/**
 * Рассчитывает возраст из даты рождения
 */
export function calculateAge(birthDate: Date, referenceDate: Date = new Date()): number {
  let age = referenceDate.getFullYear() - birthDate.getFullYear();
  const monthDiff = referenceDate.getMonth() - birthDate.getMonth();
  
  // Если день рождения еще не наступил в этом году
  if (monthDiff < 0 || (monthDiff === 0 && referenceDate.getDate() < birthDate.getDate())) {
    age--;
  }
  
  return Math.max(0, age);
}

/**
 * Рассчитывает возраст из массива [month, day, year]
 */
export function calculateAgeFromArray(dateArray: number[], referenceDate: Date = new Date()): number {
  if (!Array.isArray(dateArray) || dateArray.length !== 3) {
    return 0;
  }
  
  const [month, day, year] = dateArray;
  
  // Валидация входных данных
  if (!month || !day || !year || 
      month < 1 || month > 12 || 
      day < 1 || day > 31 || 
      year < 1900 || year > new Date().getFullYear()) {
    return 0;
  }
  
  const birthDate = new Date(year, month - 1, day); // month - 1 для JavaScript Date
  return calculateAge(birthDate, referenceDate);
}

/**
 * Определяет возрастную группу по возрасту
 */
export function getAgeGroup(age: number): typeof AGE_GROUPS[number] | null {
  return AGE_GROUPS.find(group => age >= group.min && age <= group.max) || null;
}

/**
 * Определяет поколение по году рождения
 */
export function getGeneration(birthYear: number): typeof GENERATION_GROUPS[number] | null {
  const currentYear = new Date().getFullYear();
  
  // Валидация года
  if (birthYear < 1900 || birthYear > currentYear) {
    return null;
  }
  
  return GENERATION_GROUPS.find(gen => birthYear >= gen.minYear && birthYear <= gen.maxYear) || null;
}

/**
 * Определяет поколение из массива [month, day, year]
 */
export function getGenerationFromArray(dateArray: number[]): typeof GENERATION_GROUPS[number] | null {
  if (!Array.isArray(dateArray) || dateArray.length !== 3) {
    return null;
  }
  
  const [, , year] = dateArray;
  return getGeneration(year);
}

/**
 * Создает возрастное значение для системы навигации
 * Возвращает строку которая будет использоваться в условиях
 */
export function createAgeValue(age: number): string {
  const ageGroup = getAgeGroup(age);
  return ageGroup ? ageGroup.id : `age-${age}`;
}

/**
 * Создает значение поколения для системы навигации
 */
export function createGenerationValue(birthYear: number): string {
  const generation = getGeneration(birthYear);
  return generation ? generation.id : `year-${birthYear}`;
}

/**
 * Парсит возрастной диапазон из строки (например "26-30" -> {min: 26, max: 30})
 */
export function parseAgeRange(ageRangeId: string): { min: number; max: number } | null {
  // Для конкретного возраста (например "age-25")
  if (ageRangeId.startsWith('age-')) {
    const age = parseInt(ageRangeId.replace('age-', ''));
    if (isNaN(age)) return null;
    return { min: age, max: age };
  }
  
  // Для диапазона (например "26-30")
  const match = ageRangeId.match(/^(\d+)-(\d+|\+)$/);
  if (!match) return null;
  
  const min = parseInt(match[1]);
  const max = match[2] === '+' ? 120 : parseInt(match[2]);
  
  if (isNaN(min) || isNaN(max)) return null;
  
  return { min, max };
}

/**
 * Проверяет, попадает ли возраст в указанный диапазон
 */
export function isAgeInRange(age: number, ageRangeId: string): boolean {
  const range = parseAgeRange(ageRangeId);
  if (!range) return false;
  
  return age >= range.min && age <= range.max;
}

/**
 * Примеры использования для документации
 */
export const AGE_EXAMPLES = [
  {
    input: [4, 8, 1987], // 8 апреля 1987
    age: calculateAgeFromArray([4, 8, 1987]),
    ageGroup: getAgeGroup(calculateAgeFromArray([4, 8, 1987]))?.name,
    generation: getGenerationFromArray([4, 8, 1987])?.name,
    description: "Миллениал среднего возраста"
  },
  {
    input: [12, 15, 2000], // 15 декабря 2000
    age: calculateAgeFromArray([12, 15, 2000]),
    ageGroup: getAgeGroup(calculateAgeFromArray([12, 15, 2000]))?.name,
    generation: getGenerationFromArray([12, 15, 2000])?.name,
    description: "Поколение Z"
  },
  {
    input: [7, 22, 1975], // 22 июля 1975
    age: calculateAgeFromArray([7, 22, 1975]),
    ageGroup: getAgeGroup(calculateAgeFromArray([7, 22, 1975]))?.name,
    generation: getGenerationFromArray([7, 22, 1975])?.name,
    description: "Поколение X"
  }
] as const;
