# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Build Skia for various platforms."""


from recipe_engine import recipe_api

from . import android
from . import canvaskit
from . import chromebook
from . import chromecast
from . import cmake
from . import default
from . import flutter
from . import pathkit
from . import skqp


class BuildApi(recipe_api.RecipeApi):
  def __init__(self, buildername, *args, **kwargs):
    b = buildername
    if 'SKQP' in b and not 'Test' in b:
      self.compile_fn = skqp.compile_fn
      self.copy_fn = skqp.copy_build_products
    elif 'Android' in b and not 'Flutter' in b:
      self.compile_fn = android.compile_fn
      self.copy_fn = android.copy_build_products
    elif 'Chromebook' in b:
      self.compile_fn = chromebook.compile_fn
      self.copy_fn = chromebook.copy_build_products
    elif 'Chromecast' in b:
      self.compile_fn = chromecast.compile_fn
      self.copy_fn = chromecast.copy_build_products
    elif 'Flutter' in b:
      self.compile_fn = flutter.compile_fn
      self.copy_fn = flutter.copy_build_products
    elif 'EMCC' in b:
      if 'PathKit' in b:
        self.compile_fn = pathkit.compile_fn
        self.copy_fn = pathkit.copy_build_products
      else:
        self.compile_fn = canvaskit.compile_fn
        self.copy_fn = canvaskit.copy_build_products
    elif 'CMake' in b:
      self.compile_fn = cmake.compile_fn
      self.copy_fn = cmake.copy_build_products
    else:
      self.compile_fn = default.compile_fn
      self.copy_fn = default.copy_build_products
    super(BuildApi, self).__init__(*args, **kwargs)

  def __call__(self, checkout_root, out_dir):
    """Compile the code."""
    self.compile_fn(self.m, checkout_root, out_dir)

  def copy_build_products(self, out_dir, dst):
    """Copy selected build products to dst."""
    self.copy_fn(self.m, out_dir, dst)
