"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mkdocsConfigService = void 0;
const promises_1 = require("fs/promises");
const env_1 = require("../../config/env");
const logger_1 = require("../../utils/logger");
const yaml_1 = require("yaml");
/**
 * Custom YAML tag schema to preserve !!python/name: and !!python/object: tags.
 * Without this, the yaml library would reject these custom tags.
 */
const pythonNameTag = {
    identify: () => false,
    tag: '!python/name',
    collection: undefined,
    resolve: (str) => str,
};
const pythonObjectTag = {
    identify: () => false,
    tag: '!python/object',
    collection: undefined,
    resolve: (str) => str,
};
/**
 * Parse mkdocs.yml content with support for !!python/name: tags.
 * Returns a yaml Document that preserves comments and formatting.
 */
function parseConfig(content) {
    return (0, yaml_1.parseDocument)(content, {
        customTags: (tags) => [
            ...tags,
            pythonNameTag,
            pythonObjectTag,
        ],
        keepSourceTokens: true,
    });
}
/**
 * Validate that a string is valid YAML (with python tags support).
 * Returns null if valid, error message if invalid.
 */
function validateYaml(content) {
    try {
        const doc = parseConfig(content);
        const errors = doc.errors;
        if (errors.length > 0) {
            return errors.map(e => e.message).join('; ');
        }
        return null;
    }
    catch (err) {
        return err.message;
    }
}
async function readConfig() {
    return (0, promises_1.readFile)(env_1.env.MKDOCS_CONFIG_PATH, 'utf-8');
}
async function writeConfig(content) {
    // Validate YAML first
    const error = validateYaml(content);
    if (error) {
        throw new Error(`Invalid YAML: ${error}`);
    }
    // Create backup
    try {
        await (0, promises_1.copyFile)(env_1.env.MKDOCS_CONFIG_PATH, `${env_1.env.MKDOCS_CONFIG_PATH}.bak`);
    }
    catch {
        logger_1.logger.warn('Could not create backup of mkdocs.yml');
    }
    await (0, promises_1.writeFile)(env_1.env.MKDOCS_CONFIG_PATH, content, 'utf-8');
}
/**
 * Trigger `mkdocs build --clean` via the build trigger HTTP server
 * running inside the MkDocs container on port 8001.
 */
async function triggerBuild() {
    const buildUrl = `${env_1.env.MKDOCS_PREVIEW_URL.replace(':8000', ':8001')}/build`;
    const startTime = Date.now();
    try {
        const controller = new AbortController();
        const timeout = setTimeout(() => controller.abort(), 130_000);
        const response = await fetch(buildUrl, {
            method: 'POST',
            signal: controller.signal,
        });
        clearTimeout(timeout);
        const data = await response.json();
        return data;
    }
    catch (err) {
        const duration = Date.now() - startTime;
        logger_1.logger.error('MkDocs build failed', err);
        return {
            success: false,
            output: `Build error: ${err.message}`,
            duration,
        };
    }
}
exports.mkdocsConfigService = {
    readConfig,
    writeConfig,
    validateYaml,
    parseConfig,
    triggerBuild,
};
//# sourceMappingURL=mkdocs-config.service.js.map