/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 */

/* global Windows */

var ContactField = require('./ContactField'),
    ContactAddress = require('./ContactAddress'),
    ContactName = require('./ContactName'),
    Contact = require('./Contact');


function convertToContact(windowsContact) {
    var contact = new Contact();
    var i;

    // displayName & nickname
    contact.displayName = windowsContact.name;
    contact.nickname = windowsContact.name;

    // name
    contact.name = new ContactName(windowsContact.name);

    // phoneNumbers
    contact.phoneNumbers = [];
    for (i = 0; i < windowsContact.phoneNumbers.size; i++) {
        var phone = new ContactField(windowsContact.phoneNumbers[i].category, windowsContact.phoneNumbers[i].value);
        contact.phoneNumbers.push(phone);
    }

    // emails
    contact.emails = [];
    for (i = 0; i < windowsContact.emails.size; i++) {
        var email = new ContactField(windowsContact.emails[i].category, windowsContact.emails[i].value);
        contact.emails.push(email);
    }

    // addressres
    contact.addresses = [];
    for (i = 0; i < windowsContact.locations.size; i++) {
        var address = new ContactAddress(null, windowsContact.locations[i].category,
            windowsContact.locations[i].unstructuredAddress, windowsContact.locations[i].street,
            null, windowsContact.locations[i].region, windowsContact.locations[i].postalCode,
            windowsContact.locations[i].country);
        contact.addresses.push(address);
    }

    // ims
    contact.ims = [];
    for (i = 0; i < windowsContact.instantMessages.size; i++) {
        var im = new ContactField(windowsContact.instantMessages[i].category, windowsContact.instantMessages[i].userName);
        contact.ims.push(im);
    }

    return contact;
}

module.exports = {
    pickContact: function(win, fail, args) {
        var picker = new Windows.ApplicationModel.Contacts.ContactPicker();

        function success(con) {
            // if contact was not picked
            if (!con) {
                if (fail) {
                    setTimeout(function() {
                        fail(new Error("User did not pick a contact."));
                    }, 0);
                }
                return;
            }

            // send em back
            win(convertToContact(con));
        }

        picker.selectionMode = Windows.ApplicationModel.Contacts.ContactSelectionMode.contacts; // select entire contact

        // pickContactAsync is available on Windows 8.1 or later, instead of
        // pickSingleContactAsync, which is deprecated after Windows 8,
        // so try to use newer method, if available.
        // see http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.contacts.contactpicker.picksinglecontactasync.aspx
        if (picker.pickContactAsync) {
            // TODO: 8.1 has better contact support via the 'Contact' object
        } else {
            picker.pickSingleContactAsync().done(success, fail);
        }
    },

    save:function(win,fail,args){
        if (console && console.error) {
            console.error("Error : Windows 8 does not support creating/saving contacts");
        }
        if (fail) {
            setTimeout(function () {
                fail(new Error("Contact create/save not supported on Windows 8"));
            }, 0);
        }
    },

    search: function(win, fail, args) {
        if (console && console.error) {
            console.error("Error : Windows 8 does not support searching contacts");
        }
        if (fail) {
            setTimeout(function() {
                fail(new Error("Contact search not supported on Windows 8"));
            }, 0);
        }
    }
};

require("cordova/exec/proxy").add("Contacts", module.exports);