#!/usr/bin/env python
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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 json
import time
import os
import requests


PRICES_URL = ("https://azure.microsoft.com/api/v3/pricing/"
              "virtual-machines/calculator/")
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
PRICING_FILE_PATH = os.path.join(BASE_PATH, '../libcloud/data/pricing.json')
PRICING_FILE_PATH = os.path.abspath(PRICING_FILE_PATH)


def get_azure_prices():
    prices_raw = requests.get(PRICES_URL).json()
    region_map = {}
    regions = []
    for region in prices_raw['regions']:
        regions.append(region['slug'])
        region_map[region['slug']] = region['displayName']

    result = {"windows": {}, "linux": {}}
    parsed_sizes = {"lowpriority", "basic", "standard"}
    for offer, value in prices_raw['offers'].items():

        size_raw = offer.split("-")
        #  Servers that go by the core with global price are not yet added
        if len(size_raw) != 3 or size_raw[2] not in parsed_sizes:
            continue
        if size_raw[0] not in {'linux', 'windows'}:
            continue
        size = size_raw[2] + size_raw[1]
        prices = {}
        if not value['prices'].get('perhour'):
            continue
        for reg, price in value['prices']['perhour'].items():
            region = region_map[reg].lower().replace(" ", "")
            region = region.replace("(public)", "")  # for germany
            region = region.replace("(sovereign)", "")  # for germany
            prices[region] = price['value']
        result[size_raw[0]][size] = prices

    return result


def write_azure_prices(file_path, prices):
    with open(file_path, 'r') as f:
        content = f.read()

    data = json.loads(content)
    data['updated'] = int(time.time())
    data['compute']['azure_linux'] = prices['linux']
    data['compute']['azure_windows'] = prices['windows']

    content = json.dumps(data, indent=4)
    lines = content.splitlines()
    lines = [line.rstrip() for line in lines]
    content = '\n'.join(lines)

    with open(file_path, 'w') as fp:
        fp.write(content)


def main():
    res = get_azure_prices()
    write_azure_prices(PRICING_FILE_PATH, res)


if __name__ == "__main__":
    main()
