#!/usr/bin/env python


'''Post a message to twitter'''

__author__ = 'dewitt@google.com'


try:
    import configparser
except ImportError as _:
    import configparser as configparser

import getopt
import os
import sys
import twitter
import argparse



USAGE = '''Usage: tweet [options] message
  This script posts a message to Twitter.
  Options:
    -h --help : print this help
    --consumer-key : the twitter consumer key
    --consumer-secret : the twitter consumer secret
    --access-key : the twitter access token key
    --access-secret : the twitter access token secret
    --encoding : the character set encoding used in input strings, e.g. "utf-8". [optional]
    --message : file containing text message up to 280 characters
    --image: attached image
    Documentation:
  If either of the command line flags are not present, the environment
  variables TWEETUSERNAME and TWEETPASSWORD will then be checked for your
  consumer_key or consumer_secret, respectively.
  If neither the command line flags nor the environment variables are
  present, the .tweetrc file, if it exists, can be used to set the
  default consumer_key and consumer_secret.  The file should contain the
  following three lines, replacing *consumer_key* with your consumer key, and
  *consumer_secret* with your consumer secret:
  A skeletal .tweetrc file:
    [Tweet]
    consumer_key: *consumer_key*
    consumer_secret: *consumer_password*
    access_key: *access_key*
    access_secret: *access_password*
'''
parser = argparse.ArgumentParser()
#parser.add_argument("-h", "--help", help="print this help")
parser.add_argument("-k", "--consumerkey", help="the twitter consumer key")
parser.add_argument("-s", "--consumersecret", help="the twitter consumer secret")
parser.add_argument("-a", "--accesskey", help="the Twitter access token key")
parser.add_argument("-c","--accesssecret", help="the twitter access token secret")
parser.add_argument("-e", "--encoding", help="the character set encoding used in input strings, e.g. utf-8. [optional]")
parser.add_argument("-f", "--file", help="path to text file containing < 280 characters")
parser.add_argument("-i", "--image", help="path to image attachment file")
parser.add_argument("-m", "--message", help="text of message")

args = parser.parse_args()

consumer_key = args.consumerkey
consumer_secret = args.consumersecret
access_key = args.accesskey
access_secret = args.accesssecret
encoding = args.encoding
file = args.file
image = args.image
message= args.message

def PrintUsageAndExit():
    print(USAGE)
    sys.exit(2)


def GetConsumerKeyEnv():
    return os.environ.get("TWEETUSERNAME", None)


def GetConsumerSecretEnv():
    return os.environ.get("TWEETPASSWORD", None)


def GetAccessKeyEnv():
    return os.environ.get("TWEETACCESSKEY", None)


def GetAccessSecretEnv():
    return os.environ.get("TWEETACCESSSECRET", None)


class TweetRc(object):
    def __init__(self):
        self._config = None

    def GetConsumerKey(self):
        return self._GetOption('consumer_key')

    def GetConsumerSecret(self):
        return self._GetOption('consumer_secret')

    def GetAccessKey(self):
        return self._GetOption('access_key')

    def GetAccessSecret(self):
        return self._GetOption('access_secret')

    def _GetOption(self, option):
        try:
            return self._GetConfig().get('Tweet', option)
        except:
            return None

    def _GetConfig(self):
        if not self._config:
            self._config = configparser.ConfigParser()
            self._config.read(os.path.expanduser('~/.tweetrc'))
        return self._config


def main():
        
    consumer_keyflag = None
    consumer_secretflag = None
    access_keyflag = None
    access_secretflag = None
    
    if not message:
        PrintUsageAndExit()

    rc = TweetRc()
    consumer_key = consumer_keyflag or GetConsumerKeyEnv() or rc.GetConsumerKey()
    consumer_secret = consumer_secretflag or GetConsumerSecretEnv() or rc.GetConsumerSecret()
    access_key = access_keyflag or GetAccessKeyEnv() or rc.GetAccessKey()
    access_secret = access_secretflag or GetAccessSecretEnv() or rc.GetAccessSecret()
    if not consumer_key or not consumer_secret or not access_key or not access_secret:
        PrintUsageAndExit()
    api = twitter.Api(consumer_key=consumer_key, consumer_secret=consumer_secret,
                      access_token_key=access_key, access_token_secret=access_secret,
                      input_encoding=encoding)
    try:
        status = api.PostUpdate(message)
    except UnicodeDecodeError:
        print("Your message could not be encoded.  Perhaps it contains non-ASCII characters? ")
        print("Try explicitly specifying the encoding with the --encoding flag")
        sys.exit(2)

    print("{0} just posted: {1}".format(status.user.name, status.text))

if __name__ == "__main__":
    main()