# Copyright (c) 2014 Rackspace, Inc.
#
# Licensed 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.
import ConfigParser
import json
import os
import requests
import sys

from akamai.edgegrid import EdgeGridAuth
import dns.resolver


def main(args):
    if len(args) != 3:
        print("usage: python get.py [env] [domain]")
        print(
            "example : python get.py [prod|test|prod_staging] www.mysite.com")
        sys.exit(2)

    env = args[1].replace('_staging', '')
    use_staging = args[1].endswith('_staging')
    domain = args[2]

    config_parser = ConfigParser.RawConfigParser()
    config_path = os.path.expanduser('~/.poppy/akamai.conf')
    config_parser.read(config_path)

    print("")
    print("")

    print("looking up records for " + domain)
    print("")
    print("")

    print("querying akamai api for policy definition: ")
    akamai_request(env, domain, use_staging, config_parser)
    print("")
    print("")

    print("querying DIG record:")
    dig_cname(domain)
    print("")
    print("")

    # browser_request(domain)
    print("")
    print("")


def edge_session(env, config):
    s = requests.Session()
    s.auth = EdgeGridAuth(
        # This is akamai credential
        client_token=config.get(env, 'client_token'),
        client_secret=config.get(env, 'client_secret'),
        access_token=config.get(env, 'access_token'))

    return s


def akamai_request(env, domain, use_staging, config):
    base_url = config.get(env, 'base_url')
    policy_num = config.get(env, 'policy_number')
    env_var = "production"
    if use_staging:
        env_var = "staging"

    policy_url = ('{0}partner-api/v1/network/{3}/properties/'
                  '{1}/sub-properties/{2}/policy')
    policy_url = policy_url.format(
        base_url,
        policy_num,
        domain,
        env_var
    )

    print ("API URL: " + policy_url)
    print ("ARLID: " + str(policy_num))

    s = edge_session(env, config)
    response = s.get(policy_url,
                     headers={
                         'Content-type': 'application/json',
                         'Accept': 'text/plain'
                     })
    resp_dict = json.loads(response.text)
    print(json.dumps(resp_dict, indent=4, sort_keys=True))


def dig_cname(target):
    try:
        answers = dns.resolver.query(target, 'CNAME')
        for rdata in answers:
            print("{0} IN CNAME {1}").format(answers.qname, rdata.target)
            dig_cname(rdata.target)
    except Exception as e:
        print(e)


def browser_request(target):
    print("browser response for " + target)
    response = requests.get("http://" + target)
    print ("Status Code: " + str(response.status_code))
    print ("Response Body: " + response.text)


if __name__ == '__main__':
    main(sys.argv)