// Copyright 2022 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import pluginTypescript from '@rollup/plugin-typescript';
import builtins from 'builtin-modules';
import path from 'path';
import dts from 'rollup-plugin-dts';
import sourceMaps from 'rollup-plugin-sourcemaps';

const modules = ['pw_status'];

// Bundle proto collection script
const protoCompilerConfig = {
  input: path.join('pw_protobuf_compiler', 'ts', 'build.ts'),
  output: [{
    file: path.join('dist', 'bin', 'pw_protobuf_compiler.js'),
    format: 'esm',
    banner: '#!/usr/bin/env node'
  }],
  plugins: [
    pluginTypescript({tsconfig: './tsconfig.json'}),
    resolve(),
    commonjs(),

    // Resolve source maps to the original source
    sourceMaps()
  ]
};

// Bundle Pigweed module from ts to js
const rollupConfig = modules.map((module) => {
  const modInputPath = path.join(module, 'ts');
  const modOutputPath = path.join('dist', module);
  return {
    input: path.join(modInputPath, 'index.ts'), external: builtins,
        output:
            [
              {
                file: path.join(modOutputPath, 'index.umd.js'),
                format: 'umd',
                sourcemap: true,
                name: module || 'Pigweed'
              },
              {
                file: path.join(modOutputPath, 'index.mjs'),
                format: 'esm',
                sourcemap: true,
              }
            ],
        plugins: [
          pluginTypescript(
              {tsconfig: './tsconfig.rollup.json', esModuleInterop: true}),
          // Allow node_modules resolution, so you can use 'external' to control
          // which external modules to include in the bundle
          // https://github.com/rollup/rollup-plugin-node-resolve#usage
          resolve({browser: true, preferBuiltins: false}),

          // Resolve source maps to the original source
          sourceMaps()
        ]
  }
})

// Also add .d.ts type definitions for modules
const rollupTypesConfig = modules.map((module) => {
  const modInputPath = path.join('dist', module, 'types', module, 'ts');
  const modOutputPath = path.join('dist', module);
  return {
    input: path.join(modInputPath, 'index.d.ts'),
        output: [{file: path.join(modOutputPath, 'index.d.ts'), format: 'es'}],
        plugins: [dts()]
  }
})

export default [protoCompilerConfig].concat(
    rollupConfig.concat(rollupTypesConfig));
