# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors. All rights reserved.
# 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."""

from __future__ import print_function

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
