import type { FunnelDefinition, FunnelAnswers, ListScreenDefinition, DateScreenDefinition } from "./types";

/**
 * Тип для вложенных объектов регистрации
 */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type RegistrationDataObject = Record<string, any>;

/**
 * Устанавливает значение в объекте по многоуровневому ключу через точку.
 * Например: setNestedValue({}, "profile.gender", "male") → { profile: { gender: "male" } }
 */
function setNestedValue(obj: RegistrationDataObject, path: string, value: string): void {
  const keys = path.split(".");
  let current = obj;

  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    if (!current[key] || typeof current[key] !== "object") {
      current[key] = {};
    }
    current = current[key] as RegistrationDataObject;
  }

  const lastKey = keys[keys.length - 1];
  current[lastKey] = value;
}

/**
 * Собирает данные для регистрации пользователя из ответов воронки.
 * Обрабатывает list single selection и date экраны с registrationFieldKey.
 * 
 * @param funnel - Определение воронки
 * @param answers - Ответы пользователя
 * @returns Объект с данными для регистрации
 */
export function buildRegistrationDataFromAnswers(
  funnel: FunnelDefinition,
  answers: FunnelAnswers
): RegistrationDataObject {
  const registrationData: RegistrationDataObject = {};

  // Проходим по всем экранам воронки
  for (const screen of funnel.screens) {
    // Обрабатываем list single selection экраны с registrationFieldKey
    if (screen.template === "list") {
      const listScreen = screen as ListScreenDefinition;
      
      if (
        listScreen.list.selectionType === "single" &&
        listScreen.list.registrationFieldKey &&
        answers[screen.id] &&
        answers[screen.id].length > 0
      ) {
        const selectedId = answers[screen.id][0];
        const fieldKey = listScreen.list.registrationFieldKey;
        setNestedValue(registrationData, fieldKey, selectedId);
      }
    }

    // Обрабатываем date экраны с registrationFieldKey
    if (screen.template === "date") {
      const dateScreen = screen as DateScreenDefinition;
      
      if (
        dateScreen.dateInput?.registrationFieldKey &&
        answers[screen.id] &&
        answers[screen.id].length === 3
      ) {
        const [month, day, year] = answers[screen.id];
        const monthNum = parseInt(month);
        const dayNum = parseInt(day);
        const yearNum = parseInt(year);
        
        // Проверяем что дата валидна
        if (monthNum >= 1 && monthNum <= 12 && dayNum >= 1 && dayNum <= 31 && yearNum > 1900) {
          // Форматируем в YYYY-MM-DD HH:mm с временем 12:00
          const formattedDate = `${yearNum}-${monthNum.toString().padStart(2, '0')}-${dayNum.toString().padStart(2, '0')} 12:00`;
          const fieldKey = dateScreen.dateInput.registrationFieldKey;
          setNestedValue(registrationData, fieldKey, formattedDate);
        }
      }
    }
  }

  return registrationData;
}

/**
 * Собирает данные для сессии из одного экрана с registrationFieldKey.
 * Используется при отправке данных в updateSession для конкретного экрана.
 * 
 * @param screen - Определение экрана
 * @param selectedIds - Выбранные значения пользователя на этом экране
 * @returns Объект с данными для сессии (может быть пустым если нет registrationFieldKey)
 */
export function buildSessionDataFromScreen(
  screen: { 
    template: string; 
    id: string; 
    list?: { selectionType?: string; registrationFieldKey?: string };
    dateInput?: { registrationFieldKey?: string };
  },
  selectedIds: string[]
): RegistrationDataObject {
  const sessionData: RegistrationDataObject = {};

  // Обрабатываем list single selection экраны с registrationFieldKey
  if (screen.template === "list" && screen.list) {
    const { selectionType, registrationFieldKey } = screen.list;
    
    if (
      selectionType === "single" &&
      registrationFieldKey &&
      selectedIds.length > 0
    ) {
      const selectedId = selectedIds[0];
      setNestedValue(sessionData, registrationFieldKey, selectedId);
    }
  }

  // Обрабатываем date экраны с registrationFieldKey
  if (screen.template === "date" && screen.dateInput?.registrationFieldKey) {
    // Для date экранов selectedIds = [month, day, year]
    if (selectedIds.length === 3) {
      const [month, day, year] = selectedIds;
      const monthNum = parseInt(month);
      const dayNum = parseInt(day);
      const yearNum = parseInt(year);
      
      // Проверяем что дата валидна
      if (monthNum >= 1 && monthNum <= 12 && dayNum >= 1 && dayNum <= 31 && yearNum > 1900) {
        // Форматируем в YYYY-MM-DD HH:mm с временем 12:00
        const formattedDate = `${yearNum}-${monthNum.toString().padStart(2, '0')}-${dayNum.toString().padStart(2, '0')} 12:00`;
        setNestedValue(sessionData, screen.dateInput.registrationFieldKey, formattedDate);
      }
    }
  }

  return sessionData;
}
