from exchangelib import OAUTH2, Configuration, Account, DELEGATE, OAuth2Credentials, Identity
import vcard


def normalize_name(full_name):
    return full_name.replace('/', '-').replace('\\', '-')[:40]


def normalize_phone_number(phone_number: str):
    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 login(email=None) -> Account:
    credentials = OAuth2Credentials(
        client_id='925f74dc-f96a-4718-9ca7-d6cc3fa43e1e',
        client_secret='SS~8Q~QpBZV9toZuwkzW1XGGen2Hn833spNMtdq5',
        tenant_id='2ad0dff5-07ce-4cc2-a852-99ce8b91c218',
        identity=Identity(primary_smtp_address='bedner@global-cube.de'),
    )

    # credentials = Credentials(username='bedner@global-cube.de', password='platinum512#')
    config = Configuration(
        server='outlook.office365.com',
        credentials=credentials,
        auth_type=OAUTH2
    )

    if not email:
        email = 'adressbuch@global-cube.net'

    account = Account(
        primary_smtp_address=email, config=config,
        autodiscover=False, access_type=DELEGATE
    )
    return account


def export_contact_list(account: Account):
    # folder = account.root / 'AllContacts'
    phone_types = {
        'BusinessPhone': 'gesch.', 'MobilePhone': 'Mobil',
        'OtherFax': 'Andere', 'HomePhone': 'privat',
        'CarPhone': 'Andere2', 'OtherTelephone': 'Andere3',
        'Pager': 'Pager'
    }

    contact_list = []
    # organizations = vcard.get_orgs()
    organizations = {}

    for p in account.contacts.all():
        # print(p.display_name)
        p_name = p.display_name
        if p.company_name:
            p_name = p.display_name + ' - ' + p.company_name
        elif p_name in organizations:
            p.company_name = organizations[p_name][0]
            p_name = p.display_name + ' - ' + p.company_name
            p.save(update_fields=['company_name'])

        p_name = normalize_name(p_name)

        for entry in p.phone_numbers[:2]:
            if entry.phone_number:
                phone = normalize_phone_number(entry.phone_number)
                contact_list.append(p_name + ' (' + phone_types.get(entry.label, '') + ');' + phone)

    # print(phone_types)
    block_size = 997
    blocks = (len(contact_list) // block_size) + 1
    for b in range(blocks):
        with open(f'contacts/export/kontakte_{b}.csv', 'w', encoding='utf-8') as fwh:
            fwh.write('generiert mit Templateversion:;v16.1.00\n')
            fwh.write('Voll-Lieferung\n')
            fwh.write('Nr.;Name;Rufnummer\n')
            for i, c in enumerate(contact_list[block_size * b:block_size * (b + 1)], 1):
                fwh.write(str(block_size * b + i) + ';' + c + '\n')
        print('--')


def main():
    account = login()
    # export_contact_list(account)
    for p in account.contacts.all()[0:1]:
        print(p)

    account2 = login('m.geiss@global-cube.de')
    for p in account2.contacts.all()[0:1]:
        print(p)

    # for f in account.root.children.folders:
    #     print(f.name)
    # gal = account.contacts / 'GAL Contacts'
    # for p in account.protocol.resolve_names()[:10]:
    #     print(p.display_name)
    # print(account.root.tree())


if __name__ == '__main__':
    main()