'use strict';

/**
 * Contract: data push
 *
 * Muat isi file envelope JSON (`{cwd}/data-storage/<qualifiedName>.json`) ke tabel
 * tujuan via INSERT batch dengan commit per batch. Nama file diturunkan dari SDF
 * (aturan IDENTIK `data pull`, bukan dari flag `--table` mentah). Metadata kolom +
 * tipe canonical bersumber MURNI dari SDF; konversi nilai per dialect tujuan
 * ditangani value-codec.
 *
 * Eksekusi via jalur CLI generator (cli-entry.js) tanpa gerbang license/integrity
 * (amandemen arah B, lihat docs/plan/data-pull-push/data-pull-push-09-amendments.md).
 * Handler tetap tipis: seluruh logika berada di lib/data/push-runner.js.
 *
 * Push bersifat append-only (amandemen A6, User konfirmasi 2026-06-03). Mode
 * `upsert`/`replace` di-descope dari v1, sehingga flag `--mode` dan `--force`
 * TIDAK dideklarasikan. Push selalu menjalankan jalur append (INSERT batch +
 * commit per batch). `--mode=...`/`--force` kini menjadi unknown flag → ditolak
 * arg-parser dengan exit 2 (perilaku standar).
 *
 * Catatan: scope tabel dipilih lewat tepat satu dari `--table` / `--schema` /
 * `--all-schemas`. Flag `--schema` adalah FILTER scope (bukan penentu namespace) —
 * namespace tabel tetap diambil dari SDF IR (amandemen A4). Lokasi SDF ditentukan
 * `--schema-path`. Path input mengikuti aturan IDENTIK pull (bersarang
 * `<schema>/<table>.json` untuk tabel ber-schema, flat `<table>.json` untuk tabel
 * tanpa schema).
 */

module.exports = {
    resource: 'data',
    verb: 'push',
    description: 'Muat isi file envelope JSON (data-storage/<schema>/<table>.json) ke tabel tujuan via INSERT batch berdasarkan metadata SDF',
    category: 'management',
    flags: {
        table: {
            type: 'string',
            required: false,
            default: null,
            description: 'Nama tabel tujuan yang akan di-push (harus terdaftar di SDF)'
        },
        schema: {
            type: 'string',
            required: false,
            default: null,
            description: 'Filter schema: satu atau comma-separated (mutual-exclusive dengan --table/--all-schemas)'
        },
        'all-schemas': {
            type: 'boolean',
            required: false,
            default: false,
            description: 'Push seluruh tabel di semua schema, urut topological FK parent→child (mutual-exclusive dengan --table/--schema)'
        },
        config: {
            type: 'string',
            required: false,
            default: null,
            description: 'File config database tujuan (.env). Fallback ke `.restforge/defaults.json` bila tidak disediakan eksplisit (set via `config set-default`)'
        },
        'schema-path': {
            type: 'string',
            required: false,
            default: 'schema',
            description: 'Lokasi SDF (file atau folder) sumber metadata tabel'
        },
        'storage-path': {
            type: 'string',
            required: false,
            default: 'data-storage',
            description: 'Folder sumber file envelope relatif terhadap working directory'
        },
        'batch-size': {
            type: 'number',
            required: false,
            default: 1000,
            description: 'Ukuran batch INSERT, sekaligus unit commit per batch'
        },
        json: {
            type: 'boolean',
            required: false,
            default: false,
            description: 'Output ringkasan dalam format JSON (untuk konsumsi CI/CD)'
        }
    },
    examples: [
        'npx restforge data push --table=visitors',
        'npx restforge data push --schema=public --config=db.env',
        'npx restforge data push --all-schemas --config=db.env --json',
        'npx restforge data push --table=visitors --config=db.env --batch-size=500',
        'npx restforge data push --table=visitors --config=db.env --json'
    ],
    async handler(args) {
        return require('../../lib/data/push-runner').run(args);
    }
};
