# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utilities for operations on files."""


import errno
import os
import shutil

from cros_utils import command_executer


class FileUtils(object):
    """Utilities for operations on files."""

    _instance = None
    DRY_RUN = False

    @classmethod
    def Configure(cls, dry_run):
        cls.DRY_RUN = dry_run

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            if cls.DRY_RUN:
                cls._instance = super(FileUtils, cls).__new__(
                    MockFileUtils, *args, **kwargs
                )
            else:
                cls._instance = super(FileUtils, cls).__new__(
                    cls, *args, **kwargs
                )
        return cls._instance

    def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10):
        command = "md5sum %s" % filename
        ce = command_executer.GetCommandExecuter(log_level=log_level)
        ret, out, _ = ce.RunCommandWOutput(command)
        if ret:
            raise RuntimeError("Could not run md5sum on: %s" % filename)

        return out.strip().split()[0]

    def CanonicalizeChromeOSRoot(self, chromeos_root):
        chromeos_root = os.path.expanduser(chromeos_root)
        if os.path.isdir(os.path.join(chromeos_root, "chromite")):
            return chromeos_root
        else:
            return None

    def ChromeOSRootFromImage(self, chromeos_image):
        chromeos_root = os.path.join(
            os.path.dirname(chromeos_image), "../../../../.."
        )
        return self.CanonicalizeChromeOSRoot(chromeos_root)

    def MkDirP(self, path):
        try:
            os.makedirs(path)
        except OSError as exc:
            if exc.errno == errno.EEXIST:
                pass
            else:
                raise

    def RmDir(self, path):
        shutil.rmtree(path, ignore_errors=True)

    def WriteFile(self, path, contents):
        with open(path, "w", encoding="utf-8") as f:
            f.write(contents)


class MockFileUtils(FileUtils):
    """Mock class for file utilities."""

    def Md5File(self, filename, log_level="verbose", _block_size=2 ** 10):
        return "d41d8cd98f00b204e9800998ecf8427e"

    def CanonicalizeChromeOSRoot(self, chromeos_root):
        return "/tmp/chromeos_root"

    def ChromeOSRootFromImage(self, chromeos_image):
        return "/tmp/chromeos_root"

    def RmDir(self, path):
        pass

    def MkDirP(self, path):
        pass

    def WriteFile(self, path, contents):
        pass
