#!/usr/bin/python
#
# Copyright (c) 2005, Tree House Ideas All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 
# - Neither the name of the Tree House Ideas nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Original Objective C version at http://theocacao.com/document.page/210
# Converted to Python/PyObjC by Philipp "philiKON" von Weitershausen

from Foundation import NSAutoreleasePool
from AddressBook import (
    ABAddressBook,
    ABPersonCreateSearchElement, ABSearchElementCreateWithConjunction,
    kABFirstNameProperty, kABLastNameProperty, kABEmailProperty,
    kABPhoneProperty, kABContainsSubStringCaseInsensitive, kABSearchOr)

def printPerson(person):
    first = person.valueForProperty_(kABFirstNameProperty)
    last = person.valueForProperty_(kABLastNameProperty)
    email = ''
    phone = ''

    emails = person.valueForProperty_(kABEmailProperty)
    if emails:
        primaryid = emails.primaryIdentifier()
        email = emails.valueAtIndex_(emails.indexForIdentifier_(primaryid))

    phones = person.valueForProperty_(kABPhoneProperty)
    if phones:
        primaryid = phones.primaryIdentifier()
        phone = phones.valueAtIndex_(phones.indexForIdentifier_(primaryid))

    out = u"%-30s %-18s %-35s" % (first + u' ' + last, phone, email)
    print out.encode('utf-8')

def main(argv):
    if len(argv) < 2:
        return 1

    pool = NSAutoreleasePool.alloc().init()
    book = ABAddressBook.sharedAddressBook()

    searchTerm = argv[1]
    criteria1 = ABPersonCreateSearchElement(               # from C API
        kABFirstNameProperty, None, None, searchTerm,
        kABContainsSubStringCaseInsensitive)
    criteria2 = ABPersonCreateSearchElement(               # from C API
        kABLastNameProperty, None, None, searchTerm,
        kABContainsSubStringCaseInsensitive)
    allCriteria = ABSearchElementCreateWithConjunction(    # from C API
        kABSearchOr, [criteria1, criteria2])

    results = book.recordsMatchingSearchElement_(allCriteria)
    for person in results:
        printPerson(person)

    pool.release()
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))
