/**
 * Extrae solo los valores marcados como "dirty" por react-hook-form,
 * respetando la estructura anidada de dirtyFields.
 */
export function pickFormDirtyValues<T extends Record<string, any>>(
  values: T,
  dirtyFields: Partial<Record<keyof T, any>>
): Partial<T> {
  const result: Partial<T> = {};

  for (const key in dirtyFields) {
    if (!Object.prototype.hasOwnProperty.call(dirtyFields, key)) continue;

    const isDirty = dirtyFields[key];
    const value = values[key];

    if (isDirty === true) {
      // 🔹 Campo "leaf": se ha tocado → copiar valor
      result[key] = value;
    } else if (typeof isDirty === "object" && isDirty !== null) {
      // 🔹 Campo anidado: recursión
      const nested = pickFormDirtyValues(value, isDirty);
      if (Object.keys(nested).length > 0) {
        result[key] = nested as any;
      }
    }
  }

  return result;
}

/**
 * Devuelve true si hay al menos un campo dirty en cualquier nivel.
 */
export function formHasAnyDirty(dirtyFields: Partial<Record<string, any>> | boolean): boolean {
  if (dirtyFields === true) return true;
  if (dirtyFields === false || dirtyFields == null) return false;

  if (typeof dirtyFields === "object") {
    return Object.values(dirtyFields).some((v) => formHasAnyDirty(v));
  }

  return false;
}
