#!/usr/bin/python

# Copyright 2011 Google Inc. All Rights Reserved.

import errno
import hashlib
import os
import shutil
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, block_size=2 ** 10):
    command = "md5sum %s" % filename
    ce = command_executer.GetCommandExecuter()
    ret, out, err = ce.RunCommand(command, return_output=True)
    if ret:
      raise Exception("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.isfile(os.path.join(chromeos_root,
                                   "src/scripts/run_remote_tests.sh")):
      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, "wb") as f:
      f.write(contents)


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

  def Md5File(self, filename, 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
