from O365 import Account
from O365.address_book import Contact

client_id = "925f74dc-f96a-4718-9ca7-d6cc3fa43e1e"
client_secret = "SS~8Q~QpBZV9toZuwkzW1XGGen2Hn833spNMtdq5"

account = Account(
    (client_id, client_secret), auth_flow_type="credentials", tenant_id="2ad0dff5-07ce-4cc2-a852-99ce8b91c218"
)

mailboxes = [
    "winter@global-cube.net",
    "bedner@global-cube.net",
    "brandt@global-cube.net",
    # 'd.ankenbrand@global-cube.de',
    # 'gawliczek@global-cube.de',
    "m.geiss@global-cube.net",
    "matarrelli@global-cube.net",
    "winkler@global-cube.net",
]


def copy_contact(p_from: Contact, p_to: Contact):
    p_to.display_name = p_from.display_name
    p_to.name = p_from.name
    p_to.surname = p_from.surname
    p_to.title = p_from.title
    p_to.job_title = p_from.job_title
    p_to.company_name = p_from.company_name
    p_to.department = p_from.department
    p_to.office_location = p_from.office_location
    p_to.business_phones = p_from.business_phones
    p_to.mobile_phone = p_from.mobile_phone
    p_to.home_phones = p_from.home_phones
    p_to.emails.clear()
    for rcp in p_from.emails:
        p_to.emails.add(rcp)
    p_to.business_address = p_from.business_address
    # p_to.home_address = p_from.home_address
    p_to.other_address = p_from.other_address
    p_to.categories = p_from.categories
    p_to.personal_notes = p_from.personal_notes
    p_to.save()


def sync_contacts():
    account.authenticate()
    shared = account.address_book(resource="adressbuch@global-cube.net", address_book="personal")
    shared_contacts = {p.display_name: p for p in shared.get_contacts(limit=None)}
    delete_candidates = set()

    for mailbox in mailboxes:
        print(mailbox)
        personal = account.address_book(resource=mailbox, address_book="personal")
        personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)}
        extra_contacts = set(personal_contacts.keys()).difference(shared_contacts.keys())
        print(extra_contacts)
        if len(delete_candidates) == 0:
            delete_candidates = extra_contacts
        else:
            delete_candidates = delete_candidates.intersection(extra_contacts)
        # p.delete()

        for p_shared in shared_contacts.values():
            if p_shared.display_name not in personal_contacts:
                p_new = personal.new_contact()
                copy_contact(p_shared, p_new)
            else:
                p_existing = personal_contacts[p_shared.display_name]
                if p_existing.to_api_data() != p_shared.to_api_data():
                    copy_contact(p_shared, p_existing)
    return delete_candidates


def delete_contacts(delete_candidates):
    account.authenticate()

    for mailbox in mailboxes:
        print(mailbox)
        personal = account.address_book(resource=mailbox, address_book="personal")
        personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)}

        selected_contacts = set(delete_candidates).intersection(personal_contacts.keys())
        print(selected_contacts)
        for c in selected_contacts:
            personal_contacts[c].delete()


def normalize_phone_number(phone_number: str):
    if phone_number is None:
        return None
    if phone_number.startswith("0"):
        phone_number = "+49 " + phone_number[1:]
    for c in "()/?":
        phone_number = phone_number.replace(c, "")
    return phone_number.replace(" -", "-").replace("- ", "-").replace("  ", " ")


def cleanup_contacts():
    account.authenticate()
    shared = account.address_book(resource="adressbuch@global-cube.net", address_book="personal")

    for p in shared.get_contacts(limit=None):
        business = [normalize_phone_number(no) for no in p.business_phones]
        if p.business_phones != business:
            p.business_phones = business
        home = [normalize_phone_number(no) for no in p.home_phones]
        if p.home_phones != home:
            p.home_phones = home
        mobile = normalize_phone_number(p.mobile_phone)
        if p.mobile_phone != mobile:
            p.mobile_phone = mobile
        p.save()


if __name__ == "__main__":
    contacts = sync_contacts()
    if len(contacts) > 0:
        delete_contacts(contacts)
    # cleanup_contacts()