import loconfig from '../../loconfig.json';
import message from '../utils/message.js';
import notification from '../utils/notification.js';
import postcss from '../utils/postcss.js';
import template from '../utils/template.js';
import { writeFile } from 'node:fs/promises';
import { basename } from 'node:path';
import { promisify } from 'node:util';
import sass from 'node-sass';

const sassRender = promisify(sass.render);

/**
 * Compiles and minifies main Sass files to CSS.
 */
export async function compileStyles() {
    loconfig.tasks.styles.forEach(async ({
        infile,
        outfile
    }) => {
        const name = basename((outfile || 'undefined'), '.scss');

        const timeLabel = `${name}.css compiled in`;
        console.time(timeLabel);

        try {
            infile  = template(infile);
            outfile = template(outfile);

            let result = await sassRender({
                file: infile,
                omitSourceMapUrl: true,
                outFile: outfile,
                outputStyle: 'compressed',
                sourceMap: true,
                sourceMapContents: true
            });

            if (postcss) {
                result = await postcss.process(result.css, {
                    from: outfile,
                    to: outfile,
                    map: {
                        annotation: false,
                        inline: false,
                        sourcesContent: true
                    }
                });

                if (result.warnings) {
                    const warnings = result.warnings();
                    if (warnings.length) {
                        message(`Error processing ${name}.css`, 'warning');
                        warnings.forEach((warn) => {
                            message(warn.toString());
                        });
                    }
                }
            }

            writeFile(outfile, result.css).then(() => {
                if (result.css) {
                    message(`${name}.css compiled`, 'success', timeLabel);
                } else {
                    message(`${name}.css is empty`, 'notice', timeLabel);
                }
            }).catch((err) => {
                message(`Error compiling ${name}.scss`, 'error');
                message(err);

                notification({
                    title:   `${name}.scss compilation failed 🚨`,
                    message: `Could not save stylesheet to ${name}.css`
                });
            });

            if (result.map) {
                writeFile(outfile + '.map', result.map.toString()).catch((err) => {
                    message(`Error compiling ${name}.scss`, 'error');
                    message(err);

                    notification({
                        title:   `${name}.scss compilation failed 🚨`,
                        message: `Could not save sourcemap to ${name}.css.map`
                    });
                });
            }
        } catch (err) {
            message(`Error compiling ${name}.scss`, 'error');
            message(err.formatted);

            notification({
                title:   `${name}.scss compilation failed 🚨`,
                message: err.formatted
            });
        }
    });
};

@@ -661,17 +661,16 @@
 ed'), '.
-s
 css');%0A%0A
@@ -2245,33 +2245,32 @@
 mpiling $%7Bname%7D.
-s
 css%60, 'error');%0A
@@ -2369,32 +2369,24 @@
 $%7Bname%7D.
-s
 css 
-compilation
+save
  failed 
@@ -2657,36 +2657,39 @@
 mpiling $%7Bname%7D.
-s
 css
+.map
 %60, 'error');%0A   
@@ -2797,32 +2797,28 @@
 $%7Bname%7D.
-s
 css
- compilation
+.map save
  failed 
@@ -3077,16 +3077,23 @@
 ormatted
+ %7C%7C err
 );%0A%0A    
@@ -3202,16 +3202,17 @@
 essage: 
+(
 err.form
@@ -3216,16 +3216,50 @@
 ormatted
+ %7C%7C %60$%7Berr.name%7D: $%7Berr.message%7D%60)
 %0A       

Fix messages in styles.js