import path, { resolve } from 'path';
import chalk from 'chalk';
import { dest, parallel, series, src } from 'gulp';
import gulpSass from 'gulp-sass';
import dartSass from 'sass';
import autoprefixer from 'gulp-autoprefixer';
import cleanCSS from 'gulp-clean-css';
import consola from 'consola';

const webUiLibraryOutput = resolve(__dirname, '..', '..', 'web-ui-library', 'dist');

const distFolder = path.resolve(__dirname, 'dist');
const distBundle = path.resolve(webUiLibraryOutput, 'theme-chalk');

/**
 * compile theme-chalk scss & minify
 * not use sass.sync().on('error', sass.logError) to throw exception
 * @returns
 */
function buildThemeChalk() {
	const sass = gulpSass(dartSass);
	return src(path.resolve(__dirname, 'src/*.scss'))
		.pipe(sass.sync())
		.pipe(autoprefixer({ cascade: false }))
		.pipe(
			cleanCSS({}, (details) => {
				consola.success(
					`${chalk.cyan(details.name)}: ${chalk.yellow(details.stats.originalSize / 1000)} KB -> ${chalk.green(details.stats.minifiedSize / 1000)} KB`
				);
			})
		)
		.pipe(dest(distFolder));
}

/**
 * Build dark Css Vars
 * @returns
 */
function buildDarkCssVars() {
	const sass = gulpSass(dartSass);
	return src(path.resolve(__dirname, 'src/dark/css-vars.scss'))
		.pipe(sass.sync())
		.pipe(autoprefixer({ cascade: false }))
		.pipe(
			cleanCSS({}, (details) => {
				consola.success(
					`${chalk.cyan(details.name)}: ${chalk.yellow(details.stats.originalSize / 1000)} KB -> ${chalk.green(details.stats.minifiedSize / 1000)} KB`
				);
			})
		)
		.pipe(dest(`${distFolder}/dark`));
}

/**
 * copy from packages/theme-chalk/dist to dist/web-ui-library/theme-chalk
 */
export function copyThemeChalkBundle() {
	return src(`${distFolder}/**`).pipe(dest(distBundle));
}

/**
 * copy source file to packages
 */

export function copyThemeChalkSource() {
	return src(path.resolve(__dirname, 'src/**')).pipe(dest(path.resolve(distBundle, 'src')));
}

export const build = parallel(copyThemeChalkSource, series(buildThemeChalk, buildDarkCssVars, copyThemeChalkBundle));

export default build;
