/**
 * @license
 * Copyright 2019 Google LLC. All Rights Reserved.
 * 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 typescript from "@rollup/plugin-typescript";
import { terser } from "rollup-plugin-terser";
import copy from "rollup-plugin-copy"

const PREAMBLE = `/**
 * @license
 * Copyright ${new Date().getFullYear()} Google LLC. All Rights Reserved.
 * 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
 *
 * http://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.
 * =============================================================================
 */`;

function config({
  plugins = [],
  output = {},
  external = [],
  tsCompilerOptions = {},
}) {
  const defaultTsOptions = {
    include: ["src/**/*.ts"],
    module: "ES2015",
  };
  const tsoptions = Object.assign({}, defaultTsOptions, tsCompilerOptions);

  return {
    input: "src/index.ts",
    plugins: [
      typescript(tsoptions),
      resolve(),
      // Polyfill require() from dependencies.
      commonjs({
        ignore: ["crypto", "node-fetch", "util"],
        include: "node_modules/**",
        namedExports: {
          "./node_modules/seedrandom/index.js": ["alea"],
        },
      }),
      ...plugins,
      copy({
        targets: [
          { src: 'src/model/**/*', dest: 'dist/model' }  // 复制 models 文件夹的内容到 dist/models
        ]
      })
    ],
    output: {
      banner: PREAMBLE,
      // sourcemap: true,
      globals: {
        "@tensorflow/tfjs-core": "tf",
        "@tensorflow/tfjs-converter": "tf",
      },
      ...output,
    },
    external: [
      "@tensorflow/tfjs-core",
      "@tensorflow/tfjs-converter",
      ,
      ...external,
    ],
    onwarn: (warning) => {
      let { code } = warning;
      if (
        code === "CIRCULAR_DEPENDENCY" ||
        code === "CIRCULAR" ||
        code === "THIS_IS_UNDEFINED"
      ) {
        return;
      }
      console.warn("WARNING: ", warning.toString());
    },
  };
}

module.exports = () => {
  const bundles = [];

  const terserPlugin = terser({
    output: { preamble: PREAMBLE, comments: false },
  });
  const name = "cocoSsd";
  const extend = true;
  const umdFormat = "umd";
  const fileName = "coco-ssd";

  // Node
  bundles.push(
    config({
      output: {
        format: "cjs",
        name,
        extend,
        file: `dist/${fileName}.node.js`,
        freeze: false,
      },
      tsCompilerOptions: { target: "es5" },
    })
  );

  bundles.push(
    config({
      plugins: [terserPlugin],
      output: {
        format: umdFormat,
        name,
        extend,
        file: `dist/${fileName}.min.js`,
        freeze: false,
      },
      tsCompilerOptions: { target: "es5" },
    })
  );
  // UMD default unminified (ES5)
  bundles.push(
    config({
      output: {
        format: umdFormat,
        name,
        extend,
        file: `dist/${fileName}.js`,
        freeze: false,
      },
      tsCompilerOptions: { target: "es5" },
    })
  );

  // ESM ES2017 minified
  bundles.push(
    config({
      plugins: [terserPlugin],
      output: {
        format: umdFormat,
        name,
        extend,
        file: `dist/${fileName}.es2017.esm.min.js`,
      },
      tsCompilerOptions: { target: "es2017" },
    })
  );
  return bundles;
};
