# Copyright 2016 gRPC authors.
#
# 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.
"""Buildgen package version plugin

This parses the list of targets from the yaml build file, and creates
a custom version string for each language's package.

"""

import re

LANGUAGES = [
    'core',
    'cpp',
    'csharp',
    'node',
    'objc',
    'php',
    'python',
    'ruby',
]


class Version:

    def __init__(self, version_str, override_major=None):
        self.tag = None
        if '-' in version_str:
            version_str, self.tag = version_str.split('-')
        self.major, self.minor, self.patch = [
            int(x) for x in version_str.split('.')
        ]
        if override_major:
            self.major = override_major

    def __str__(self):
        """Version string in a somewhat idiomatic style for most languages"""
        version_str = '%d.%d.%d' % (self.major, self.minor, self.patch)
        if self.tag:
            version_str += '-%s' % self.tag
        return version_str

    def pep440(self):
        """Version string in Python PEP440 style"""
        s = '%d.%d.%d' % (self.major, self.minor, self.patch)
        if self.tag:
            # we need to translate from grpc version tags to pep440 version
            # tags; this code is likely to be a little ad-hoc
            if self.tag == 'dev':
                s += '.dev0'
            elif len(self.tag) >= 3 and self.tag[0:3] == 'pre':
                s += 'rc%d' % int(self.tag[3:])
            else:
                raise Exception(
                    'Don\'t know how to translate version tag "%s" to pep440' %
                    self.tag)
        return s

    def ruby(self):
        """Version string in Ruby style"""
        if self.tag:
            return '%d.%d.%d.%s' % (self.major, self.minor, self.patch,
                                    self.tag)
        else:
            return '%d.%d.%d' % (self.major, self.minor, self.patch)

    def php(self):
        """Version string for PHP PECL package"""
        s = '%d.%d.%d' % (self.major, self.minor, self.patch)
        if self.tag:
            if self.tag == 'dev':
                s += 'dev'
            elif len(self.tag) >= 3 and self.tag[0:3] == 'pre':
                s += 'RC%d' % int(self.tag[3:])
            else:
                raise Exception(
                    'Don\'t know how to translate version tag "%s" to PECL version'
                    % self.tag)
        return s

    def php_stability(self):
        """stability string for PHP PECL package.xml file"""
        if self.tag:
            return 'beta'
        else:
            return 'stable'

    def php_composer(self):
        """Version string for PHP Composer package"""
        return '%d.%d.%d' % (self.major, self.minor, self.patch)

    def php_current_version(self):
        return '7.2'

    def php_debian_version(self):
        return 'stretch'


def mako_plugin(dictionary):
    """Expand version numbers:
     - for each language, ensure there's a language_version tag in
       settings (defaulting to the master version tag)
     - expand version strings to major, minor, patch, and tag
  """

    settings = dictionary['settings']
    version_str = settings['version']
    master_version = Version(version_str)
    settings['version'] = master_version
    for language in LANGUAGES:
        version_tag = '%s_version' % language
        override_major = settings.get('%s_major_version' % language, None)
        if version_tag in settings:
            settings[version_tag] = Version(settings[version_tag],
                                            override_major=override_major)
        else:
            settings[version_tag] = Version(version_str,
                                            override_major=override_major)
    settings['protobuf_major_minor_version'] = ('.'.join(
        settings['protobuf_version'].split('.')[:2]))
