# -*- coding: utf-8 -*-
# Copyright 2019 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.

"""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
