#!/usr/bin/env python

import logging
import os
import sys
from getpass import getpass
from optparse import OptionParser

from attachment_downloader.attachment_downloader import AttachmentDownloader

if __name__ == '__main__':

    std_out_stream_handler = logging.StreamHandler(sys.stdout)
    std_out_stream_handler.setLevel(logging.DEBUG)
    std_out_stream_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

    root_logger = logging.getLogger()
    root_logger.setLevel(logging.INFO)
    root_logger.addHandler(std_out_stream_handler)

    parser = OptionParser()
    parser.add_option("--host", dest="host", help="IMAP Host")
    parser.add_option("--username", dest="username", help="IMAP Username")
    parser.add_option("--password", dest="password", help="IMAP Password")
    parser.add_option("--imap-folder", dest="imap_folder", help="IMAP Folder to extract attachments from")
    parser.add_option("--output", dest="download_folder", help="Output directory for attachment download")

    (options, args) = parser.parse_args()

    if not options.host:
        parser.error('--host parameter required')
    if not options.username:
        parser.error('--username parameter required')
    if not options.imap_folder:
        parser.error('--folder parameter required')
    if not options.download_folder:
        parser.error('--output parameter required')

    password = options.password if options.password else getpass('IMAP Password: ')

    downloader = AttachmentDownloader(options.host)

    logging.info("Logging in to: '%s' as '%s'", options.host, options.username)
    downloader.login(options.username, password)

    logging.info("Listing messages folder folder: %s", options.imap_folder)
    messages = downloader.list_messages(options.imap_folder)

    for message in messages:
        for attachment_name in message.list_attachments():
            download_filename = os.path.join(options.download_folder, attachment_name)
            logging.info("Downloading attachment '%s' for message '%s': %s", attachment_name, message.subject,
                         download_filename)
            fp = open(download_filename, 'wb')
            fp.write(message.get_attachment_payload(attachment_name))
            fp.close()
    logging.info('Finished processing messages')

    logging.info('Logging out of: %s', options.host)
    downloader.logout()

    logging.info("Done")
