#!/usr/bin/python
# Copyright 2010 Google Inc.
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0

# Google's Python Class
# http://code.google.com/edu/languages/google-python-class/

import sys
import re
import os
import shutil
import commands

"""Copy Special exercise
"""

# +++your code here+++
# Write functions and modify main() to call them

def get_special_paths(dir_name):
  specials = []
  filenames = os.listdir(dir_name)
  for filename in filenames:
    special = re.search(r'__(\w+)__', filename)
    if special:
      specials.append(os.path.abspath(os.path.join(dir_name, filename)))
  return specials

def copy_to(path_list, copy_dir):
  if not os.path.exists(copy_dir):
    os.makedirs(copy_dir)
  for path in path_list:
    filename = os.path.basename(path)
    shutil.copy(path, os.path.join(copy_dir, filename))

def zip_to(path_list, zip_dir):
  cmd = 'zip -j ' + zip_dir + ' ' + ''.join(path_list)
  print "Command I'm going to do: " + cmd
  (status, output) = commands.getstatusoutput(cmd)
  if status:
    sys.stderr.write(output)
    sys.exit(1)


def main():
  # This basic command line argument parsing code is provided.
  # Add code to call your functions below.

  # Make a list of command line arguments, omitting the [0] element
  # which is the script itself.
  args = sys.argv[1:]
  if not args:
    print "usage: [--todir dir][--tozip zipfile] dir [dir ...]";
    sys.exit(1)

  # todir and tozip are either set from command line
  # or left as the empty string.
  # The args array is left just containing the dirs.
  todir = ''
  if args[0] == '--todir':
    todir = args[1]
    del args[0:2]

  tozip = ''
  if args[0] == '--tozip':
    tozip = args[1]
    del args[0:2]

  if len(args) == 0:
    print "error: must specify one or more dirs"
    sys.exit(1)

  # +++your code here+++
  # Call your functions
  special_paths = []
  for directory_name in args:
    special_paths.extend(get_special_paths(directory_name))

  if todir:
    copy_to(special_paths, todir)
  elif tozip:
    zip_to(special_paths, tozip)
  else:
    print '\n'.join(special_paths)

if __name__ == "__main__":
  main()
