# -*- coding: utf-8 -*-
"""Class to manage saving the state of the new_variant process

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

from __future__ import print_function
import os
# pylint: disable=import-error
# False positive from pylint; python is perfectly capable of importing yaml
import yaml
# pylint: enable=import-error


class variant_status(yaml.YAMLObject):
    """Class to manage saving the state of the new_variant process

    When creating a new variant of a base board, there are several scripts that
    run, possibly at different times. We need to keep track of some basic data
    about the new variant that's being created, where we are in the overall
    process, and information like the CL number or Change-Id for all of the
    different CLs. This class provides a way to save all of that data into a
    yaml file in the user's home directory.
    """
    yaml_loader = yaml.SafeLoader
    yaml_tag = u'!variant_status'
    def __init__(self, yaml_name='.new_variant.yaml'):
        """Initialize the class

        yaml_name will be the full path and name of the yaml file in the
        current user's home directory.

        Params:
            Name of the yaml file, defaults to 'new_variant.yaml'
        """
        self.yaml_file = os.path.expanduser(os.path.join('~', yaml_name))
        self.board = None
        self.variant = None
        self.bug = None
        self.step = None


    def __repr__(self):
        return '{!s}(board={!r}, variant={!r}, bug={!r}, state={!r})'.format(
            self.__class__.__name__, self.board, self.variant, self.bug,
            self.step)


    def save(self):
        """Save class data into the yaml file"""
        with open(self.yaml_file, 'w') as stream:
            yaml.dump(self, stream, default_flow_style=False)


    def load(self):
        """Load data structure from the yaml file"""
        with open(self.yaml_file, 'r') as stream:
            obj = yaml.safe_load(stream)
            # Copy everything from new object into self
            self.__dict__.update(obj.__dict__)


    def rm(self):
        """Delete the yaml file"""
        os.remove(self.yaml_file)


    def yaml_file_exists(self):
        """Determine if the yaml file exists

        Returns:
            True if the file exists, False otherwise
        """
        return os.path.exists(self.yaml_file) and os.path.isfile(self.yaml_file)
