import csv
import os


def descriptor_csv_exp(descr, head=True, incl_fields=[], excl_fields=[]):
  """
  Takes a single descriptor object, puts it in a list, and passes it to
  descriptors_csv_exp to build a csv.

  :param object descr: single descriptor object to export as csv.
  """
  descriptor = [descr]
  return descriptors_csv_exp(descriptor, head, incl_fields, excl_fields)


def descriptors_csv_exp(descrs, head=True, incl_fields=[], excl_fields=[]):
  """
  Builds a csv file based on attributes of descriptors.

  :param list descrs: List of descriptor objects to export as a csv file.
  :param bool head: whether or not a header is requested in the csv file.
  :param list incl_fields: list of attribute fields to include in the csv file.
  :param list excl_fields: lsit of attribute fields to exclude from csv file.
  """
  
  doc_loc = os.path.expanduser('~') + '/torexport.csv'
  doc = open(doc_loc, 'w')

  first = True

  for desc in descrs:
    attr = vars(desc)

    # Defining incl_fields and the dwriter object requires having access
    # to a descriptor object.
    if first:
      # define incl_fields, 4 cases where final case is incl_fields already
      # defined and excl_fields left blank, so no action is necessary.
      if not incl_fields and excl_fields:
        incl_fields = attr.keys()
        for f in excl_fields:
          if f in incl_fields:
            incl_fields.remove(f)

      elif not incl_fields and not excl_fields:
        incl_fields = attr.keys()

      elif incl_fields and excl_fields:
        for f in excl_fields:
          incl_fields.remove(f)

      dwriter = csv.DictWriter(doc, incl_fields)
      if head:
        dwriter.writeheader()

      # Need to remove fields that aren't wanted for dwriter.
      final = {}
      for at in attr:
        if at in incl_fields:
          final[at] = attr[at]
      dwriter.writerow(final)
      
      first = False
    else:
      # Need to remove fields that aren't wanted for dwriter.
      final = {}
      for at in attr:
        if at in incl_fields:
          final[at] = attr[at]
      dwriter.writerow(final)

  doc.close()

