#!/usr/bin/env python
# license: Creative Commons Zero

import warnings, os, sys
from optparse import OptionParser

parser = OptionParser(description='Converts a vcard file to a twinkle address book file. Defaults are in parentheses.')
parser.add_option('-i', '--in',
 dest='vcf', default='-',
 help='Set input vcf file (stdin)')
parser.add_option('-o', '--out',
 dest='twinkle_ab', default='-',
 help='Set output twinkle file (stdout)')
parser.add_option('-f', '--force',
 action='store_true', dest='force', default='False',
 help='If output file already exists, replace it (false).')

(options, args) = parser.parse_args()

if options.twinkle_ab == '-':
 out = sys.stdout
elif options.force == True: 
 out = open(options.twinkle_ab, 'w')
elif not os.path.exists(options.twinkle_ab):
 out = open(options.twinkle_ab, 'w')
else:
 print "'" + options.twinkle_ab + "' already exists"
 raise IOError

import vobject, csv

def get_input():
 """Return input from stdin or chosen VCF file."""
 if options.vcf == '-':
  return sys.stdin
 else:
  inputfile = open(options.vcf, 'r')
  return inputfile
  inputfile.close()

twriter = csv.writer(out, delimiter='|', quoting=csv.QUOTE_NONE, escapechar='\\')
out.write('# first_name|infix_name|last_name|sip_address|remark\n')

for vcard in vobject.readComponents(get_input()):
 try:
  vcard.tel_list
 except AttributeError:
  pass
 else:
  for tel in vcard.tel_list:
   try:
    types = ','.join(sorted(tel.params['TYPE']))
   except KeyError:
    types = ''
   twriter.writerow((vcard.n.value.given, vcard.n.value.additional,
   vcard.n.value.family, tel.value, types))

if options.twinkle_ab != '-':
 out.close()
