import type { UXDataWriteOptions } from "@vrtmrz/livesync-commonlib/compat/common/types";

/**
 * Coerce the timestamp fields of a write-options object to integer milliseconds.
 *
 * On mobile, Obsidian forwards `mtime`/`ctime` to Capacitor's
 * Filesystem.setTimes, whose native binding casts the value to a Java `Long`.
 * A non-integer (float) timestamp makes that cast throw
 * `ClassCastException: Double cannot be cast to Long`, which crashes the app on
 * launch as soon as such a document is replicated in. Float timestamps can
 * enter the database from any client that stores `fs.Stats.mtimeMs` without
 * flooring. Flooring at the storage boundary guarantees every Obsidian write
 * carries an integer, so a float timestamp already present in the mesh cannot
 * brick the app.
 *
 * Returns a shallow copy so the caller's options object is not mutated; passes
 * `undefined` through unchanged.
 */
export function toIntegerTimestamps(options?: UXDataWriteOptions): UXDataWriteOptions | undefined {
    if (!options) return options;
    const sanitized: UXDataWriteOptions = { ...options };
    if (typeof sanitized.mtime === "number") sanitized.mtime = Math.floor(sanitized.mtime);
    if (typeof sanitized.ctime === "number") sanitized.ctime = Math.floor(sanitized.ctime);
    return sanitized;
}
