#!/usr/bin/env python
#
# Copyright 2018 - The Android Open Source Project
#
# 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.
r"""BaseAVDCreate class.

Parent class that will hold common logic for AVD creation use cases.
"""

from acloud.internal import constants
from acloud.internal.lib import utils


class BaseAVDCreate(object):
    """Base class for all AVD intance creation classes."""

    def _CreateAVD(self, avd_spec, no_prompts):
        """Do the actual creation work, should be overridden by child classes.

        Args:
            avd_spec: AVDSpec object that tells us what we're going to create.
            no_prompts: Boolean, True to skip all prompts.
        """
        raise NotImplementedError

    def Create(self, avd_spec, no_prompts):
        """Create the AVD.

        Args:
            avd_spec: AVDSpec object that tells us what we're going to create.
            no_prompts: Boolean, True to skip all prompts.
        """
        self.PrintAvdDetails(avd_spec)
        results = self._CreateAVD(avd_spec, no_prompts)
        utils.PrintDeviceSummary(results)
        return results

    @staticmethod
    def PrintAvdDetails(avd_spec):
        """Display spec information to user.

        Example:
            Creating remote AVD instance with the following details:
            Image:
              aosp/master - aosp_cf_x86_phone-userdebug [1234]
            hw config:
              cpu - 2
              ram - 2GB
              disk - 10GB
              display - 1024x862 (224 DPI)

        Args:
            avd_spec: AVDSpec object that tells us what we're going to create.
        """
        utils.PrintColorString(
            "Creating %s AVD instance with the following details:" %
            avd_spec.instance_type)
        if avd_spec.image_source == constants.IMAGE_SRC_LOCAL:
            utils.PrintColorString("Image (local):")
            utils.PrintColorString("  %s" % avd_spec.local_image_dir)
        elif avd_spec.image_source == constants.IMAGE_SRC_REMOTE:
            utils.PrintColorString("Image:")
            utils.PrintColorString(
                "  %s - %s [%s]" %
                (avd_spec.remote_image[constants.BUILD_BRANCH],
                 avd_spec.remote_image[constants.BUILD_TARGET],
                 avd_spec.remote_image[constants.BUILD_ID]))
        utils.PrintColorString("hw config:")
        utils.PrintColorString("  cpu - %s" % (avd_spec.hw_property[constants.HW_ALIAS_CPUS]))
        utils.PrintColorString("  ram - %dGB" % (
            int(avd_spec.hw_property[constants.HW_ALIAS_MEMORY]) / 1024))
        utils.PrintColorString("  disk - %dGB" % (
            int(avd_spec.hw_property[constants.HW_ALIAS_DISK]) / 1024))
        utils.PrintColorString(
            "  display - %sx%s (%s DPI)" %
            (avd_spec.hw_property[constants.HW_X_RES],
             avd_spec.hw_property[constants.HW_Y_RES],
             avd_spec.hw_property[constants.HW_ALIAS_DPI]))
        utils.PrintColorString("\n")
