// .gitea/scripts/replaceTokens.js
// Skanuje:
//  - artifacts/frontend/**/*.js
//  - artifacts/webapi/appsettings.json (jeśli jest)
//  - artifacts/webapi/client_secrets.json (jeśli jest)
// Tokeny: #{NAME}# -> wartość z VARIABLES/SECRETS (NAME: uppercased, '-'->'_')
// Dodatkowo: #{BUILDID}# -> RUN_ID (z ENV)

const fs = require('fs');
const path = require('path');

function walk(dir, predicate) {
    const out = [];
    if (!fs.existsSync(dir)) return out;
    for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
        const full = path.join(dir, entry.name);
        if (entry.isDirectory()) out.push(...walk(full, predicate));
        else if (predicate(full)) out.push(full);
    }
    return out;
}

function replaceInFile(file, mapToken) {
    let data = fs.readFileSync(file, 'utf8');
    const re = /#\{(.*?)\}#/g;
    let changed = false;
    data = data.replace(re, (_, raw) => {
        const token = (raw || '').replace(/-/g, '_').toUpperCase();
        const val = mapToken(token);
        if (val == null || val === '') return `#{${raw}}#`; // zostaw bez zmian, podbijemy błąd później
        changed = true;
        return String(val);
    });
    fs.writeFileSync(file, data, 'utf8');
    return changed;
}

(async () => {
    const secrets = JSON.parse(process.env.SECRETS || '{}');
    const variables = JSON.parse(process.env.VARIABLES || '{}');
    const RUN_ID = process.env.RUN_ID || process.env.GITHUB_RUN_ID || '';

    const mapToken = (token) => {
        if (token === 'BUILDID') return RUN_ID;
        return (variables[token] != null ? variables[token] : secrets[token]);
    };

    // 1) Frontend: wszystkie .js
    const feRoot = path.resolve('artifacts/frontend');
    const feFiles = walk(feRoot, (f) => f.endsWith('.js'));

    // 2) Backend: wybrane pliki jeśli istnieją
    const beRoot = path.resolve('artifacts/webapi');
    const beFiles = []
    ;['appsettings.json', 'client_secrets.json'].forEach((name) => {
        const p = path.join(beRoot, name);
        if (fs.existsSync(p)) beFiles.push(p);
    });

    const files = [...feFiles, ...beFiles];

    if (files.length === 0) {
        console.error('❌ No candidate files found to tokenize (frontend .js / backend json).');
        process.exit(1);
    }

    console.log(`🔎 Tokenizing ${files.length} file(s)`);
    const missing = new Set();

    // drugi przebieg: wypisz brakujące tokeny, jeśli jakieś zostały w plikach
    for (const file of files) {
        // pierwsze podejście: podstaw wartości
        replaceInFile(file, mapToken);
    }
    for (const file of files) {
        const content = fs.readFileSync(file, 'utf8');
        const reLeft = /#\{(.*?)\}#/g;
        let m;
        while ((m = reLeft.exec(content))) {
            const token = (m[1] || '').replace(/-/g, '_').toUpperCase();
            missing.add(token);
        }
    }

    if (missing.size > 0) {
        console.error(`❌ Missing values for tokens: ${Array.from(missing).join(', ')}`);
        process.exit(1);
    }

    console.log('✅ Tokenization complete.');
})();