# Copyright 2018 Google LLC
#
# 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.

"""This script is used to synthesize generated parts of this library."""

import synthtool as s
import synthtool.gcp as gcp
import logging
import os
import re

logging.basicConfig(level=logging.DEBUG)

gapic = gcp.GAPICGenerator()

v1_library = gapic.ruby_library(
    'pubsub', 'v1',
    config_path='/google/pubsub/artman_pubsub.yaml',
    artman_output_name='google-cloud-ruby/google-cloud-pubsub'
)
os.rename(v1_library / 'lib/google/cloud/pub_sub', v1_library / 'lib/google/cloud/pubsub')
os.rename(v1_library / 'lib/google/cloud/pub_sub.rb', v1_library / 'lib/google/cloud/pubsub.rb')
s.copy(v1_library / 'lib/google/cloud/pubsub/v1')
s.copy(v1_library / 'lib/google/pubsub/v1')

# Omitting lib/google/cloud/pusbusb/v1.rb for now because we are not exposing
# the low-level API.

# Permanent: Rename pub_sub file paths to pubsub
s.replace(
    'lib/google/cloud/pubsub/v1/*.rb',
    'require "google/cloud/pub_sub',
    'require "google/cloud/pubsub')
s.replace(
    'lib/google/cloud/pubsub/v1/*.rb',
    'google-cloud-pub_sub',
    'google-cloud-pubsub')

# Permanent: Alias Google::Cloud::Pubsub to Google::Cloud::PubSub
s.replace(
    'lib/google/cloud/pubsub/v1/*.rb',
    '\n    end\n  end\nend',
    '\n    end\n\n    Pubsub = PubSub unless const_defined? :Pubsub\n  end\nend'
)

# Support for service_address
s.replace(
    'lib/google/cloud/pubsub/v*/*_client.rb',
    '\n(\\s+)#(\\s+)@param exception_transformer',
    '\n\\1#\\2@param service_address [String]\n' +
        '\\1#\\2  Override for the service hostname, or `nil` to leave as the default.\n' +
        '\\1#\\2@param service_port [Integer]\n' +
        '\\1#\\2  Override for the service port, or `nil` to leave as the default.\n' +
        '\\1#\\2@param exception_transformer'
)
s.replace(
    'lib/google/cloud/pubsub/v*/*_client.rb',
    '\n(\\s+)metadata: nil,\n\\s+exception_transformer: nil,\n',
    '\n\\1metadata: nil,\n\\1service_address: nil,\n\\1service_port: nil,\n\\1exception_transformer: nil,\n'
)
s.replace(
    'lib/google/cloud/pubsub/v*/*_client.rb',
    'service_path = self\\.class::SERVICE_ADDRESS',
    'service_path = service_address || self.class::SERVICE_ADDRESS'
)
s.replace(
    'lib/google/cloud/pubsub/v*/*_client.rb',
    'port = self\\.class::DEFAULT_SERVICE_PORT',
    'port = service_port || self.class::DEFAULT_SERVICE_PORT'
)

# https://github.com/googleapis/gapic-generator/issues/2124
s.replace(
    'lib/google/cloud/pubsub/v1/credentials.rb',
    'SCOPE = \[[^\]]+\]\.freeze',
    'SCOPE = ["https://www.googleapis.com/auth/pubsub"].freeze')

# https://github.com/googleapis/gapic-generator/issues/2242
def escape_braces(match):
    expr = re.compile('^([^`]*(`[^`]*`[^`]*)*)([^`#\\$\\\\])\\{([\\w,]+)\\}')
    content = match.group(0)
    while True:
        content, count = expr.subn('\\1\\3\\\\\\\\{\\4}', content)
        if count == 0:
            return content
s.replace(
    'lib/google/cloud/pubsub/v1/**/*.rb',
    '\n(\\s+)#[^\n]*[^\n#\\$\\\\]\\{[\\w,]+\\}',
    escape_braces)

# https://github.com/googleapis/gapic-generator/issues/2243
s.replace(
    'lib/google/cloud/pubsub/v1/*_client.rb',
    '(\n\\s+class \\w+Client\n)(\\s+)(attr_reader :\\w+_stub)',
    '\\1\\2# @private\n\\2\\3')

# https://github.com/googleapis/gapic-generator/issues/2279
s.replace(
    'lib/**/*.rb',
    '\\A(((#[^\n]*)?\n)*# (Copyright \\d+|Generated by the protocol buffer compiler)[^\n]+\n(#[^\n]*\n)*\n)([^\n])',
    '\\1\n\\6')

# https://github.com/protocolbuffers/protobuf/issues/5584
s.replace(
    'lib/google/pubsub/v1/*_pb.rb',
    '\nmodule Google::Cloud::PubSub::V1\n',
    '\nmodule Google\n  module Cloud\n    module PubSub\n    end\n  end\n  Pubsub = Cloud::PubSub unless const_defined? :Pubsub\nend\nmodule Google::Cloud::PubSub::V1\n',
)

# https://github.com/googleapis/gapic-generator/issues/2525
s.replace(
    'lib/google/cloud/pubsub/v1/**/*.rb',
    'Google::Pubsub',
    'Google::Cloud::PubSub')
s.replace(
    'lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/**/*.rb',
    '\n  module Pubsub\n',
    '\n  module Cloud\n  module PubSub\n'
)
s.replace(
    'lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/**/*.rb',
    '\n  end\n',
    '\n  end\n  end\n'
)

# https://github.com/googleapis/google-cloud-ruby/issues/3058
s.replace(
    'lib/google/cloud/pubsub/v1/*_client.rb',
    '(require \".*credentials\"\n)\n',
    '\\1require "google/cloud/pubsub/version"\n\n'
)
s.replace(
    'lib/google/cloud/pubsub/v1/*_client.rb',
    'Gem.loaded_specs\[.*\]\.version\.version',
    'Google::Cloud::PubSub::VERSION'
)
