// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import { getLowestCommonAncestor, getLeafChange, } from "@lix-js/sdk";
export const detectConflicts = async ({ sourceLix, targetLix, leafChangesOnlyInSource, }) => {
    const result = [];
    for (const change of leafChangesOnlyInSource) {
        const lowestCommonAncestor = await getLowestCommonAncestor({
            sourceChange: change,
            sourceLix,
            targetLix,
        });
        if (lowestCommonAncestor === undefined) {
            // no common parent, no conflict. must be an insert
            continue;
        }
        const leafChangeInTarget = await getLeafChange({
            change: lowestCommonAncestor,
            lix: targetLix,
        });
        if (lowestCommonAncestor.id === leafChangeInTarget.id) {
            // no conflict. the lowest common ancestor is
            // the leaf change in the target. aka, no changes
            // in target have been made that could conflict with the source
            continue;
        }
        const hasDiff = JSON.stringify(change.value) !== JSON.stringify(leafChangeInTarget.value);
        if (hasDiff === false) {
            // TODO we have two different changes that yielded the same snapshot,
            // lix or the plugin need to change the parents of the target change
            // to both the source and the target change. users likely want to
            // see that two "branches" led to the same snapshot
            continue;
        }
        // naive raise any snapshot difference as a conflict for now
        // more sophisticated conflict reporting can be incrementally added
        result.push({
            change_id: leafChangeInTarget.id,
            conflicting_change_id: change.id,
            reason: "The snapshots of the change do not match. More sophisticated reasoning will be added later.",
        });
    }
    return result;
};
//# sourceMappingURL=detectConflicts.js.map