// engine/local-first/crdt-generator.ts — SPEC-047
// Generates CRDT acceptance criteria for create_spec HU.md content.
/** Base CRDT convergence criteria applicable to all CRDT libraries. */
function getConvergenceCriteria() {
    return [
        {
            title: 'CRDT Convergence Property',
            body: 'Las operaciones CRDT son conmutativas, asociativas e idempotentes — dos clientes con los mismos datos deben converger al mismo estado sin importar el orden de operaciones',
            testable: true,
        },
        {
            title: 'Merge Offline Changes',
            body: 'El merge de cambios offline funciona correctamente: si usuario A y B editan el mismo documento offline, al sincronizar no hay pérdida de datos',
            testable: true,
        },
        {
            title: 'Extreme Offline — 72h scenario',
            body: 'Un usuario puede trabajar 72h offline y sincronizar sin pérdida de datos ni conflictos irresolubles',
            testable: true,
        },
    ];
}
/** Conflict resolution criteria based on data type. */
function getConflictResolutionCriteria(crdtLibrary) {
    const criteria = [
        {
            title: 'Last-Write-Wins Register',
            body: 'Las operaciones de reemplazo total de documento usan Last-Write-Wins Registers con timestamps lógicos (Hybrid Logical Clocks)',
            testable: true,
        },
        {
            title: 'Conflict Resolution Documentation',
            body: 'Los conflictos de tipo último-en-ganar están documentados con timestamps de vector clock, los conflictos estructurales usan merge semántico por tipo de dato',
            testable: false,
        },
    ];
    if (crdtLibrary === 'yjs') {
        criteria.push({
            title: 'Yjs Text — Sequence CRDT',
            body: 'El texto colaborativo usa Yjs Y.Text (secuencia CRDT) — dos usuarios editando el mismo párrafo producen un merge sin pérdida de caracteres',
            testable: true,
        });
        criteria.push({
            title: 'Yjs Array — CRDT List',
            body: 'Las listas de ítems usan Yjs Y.Array — inserción y eliminación concurrente producen resultados deterministas',
            testable: true,
        });
    }
    if (crdtLibrary === 'automerge') {
        criteria.push({
            title: 'Automerge Document Merge',
            body: 'Las estructuras complejas usan Automerge Document — el merge JSON-CRDT preserva todos los campos editados concurrentemente',
            testable: true,
        });
    }
    return criteria;
}
/** Format CRDT criteria as HU.md lines. */
export function formatCrdtCriteriaAsLines(criteria) {
    const lines = ['', '## CRDT & Colaboración', ''];
    for (const c of criteria) {
        lines.push(`- [ ] **${c.title}**: ${c.body}`);
        if (c.testable) {
            lines.push('  - _Testable con property-based testing: dos clientes aplican operaciones en orden diferente y el estado final debe ser igual_');
        }
    }
    lines.push('');
    return lines;
}
/**
 * Generate CRDT criteria for a project.
 * Includes base convergence criteria + library-specific conflict resolution.
 */
export function generateCrdtCriteria(crdtLibrary) {
    return [...getConvergenceCriteria(), ...getConflictResolutionCriteria(crdtLibrary)];
}
//# sourceMappingURL=crdt-generator.js.map