# Copyright 2020 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
#
#     https://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.


module Google
  module Cloud
    module Translate
      module V2
        ##
        # # Translation
        #
        # Represents a translation query result. Returned by {Google::Cloud::Translate::V2::Api#translate}.
        #
        # @see https://cloud.google.com/translation/docs/translating-text#Translate Translating Text
        #
        # @example
        #   require "google/cloud/translate/v2"
        #
        #   translate = Google::Cloud::Translate::V2.new
        #
        #   translation = translate.translate "Hello world!", to: "la"
        #
        #   translation.to_s #=> "Salve mundi!"
        #
        #   translation.from #=> "en"
        #   translation.origin #=> "Hello world!"
        #   translation.to #=> "la"
        #   translation.text #=> "Salve mundi!"
        #
        class Translation
          ##
          # The translated result.
          #
          # @return [String]
          attr_reader :text
          alias to_s text
          alias to_str text

          ##
          # The original query text that was translated.
          #
          # @return [String]
          attr_reader :origin

          ##
          # The target language into which the text was translated.
          #
          # @return [String]
          attr_reader :to
          alias language to
          alias target to

          ##
          # The source language from which the text was translated.
          #
          # @return [String]
          attr_reader :from
          alias source from

          ##
          # The translation model. Can be either `base` for the Phrase-Based Machine Translation (PBMT) model, or `nmt`
          # for the Neural Machine Translation (NMT) model. If you did not include a model parameter with your request,
          # then this field is not included in the response.
          #
          # @return [String]
          attr_reader :model

          ##
          # @private Create a new object.
          def initialize text, to, origin, from, model, detected
            @text = text
            @to = to
            @origin = origin
            @from = from
            @model = model
            @detected = detected
          end

          ##
          # Determines if the source language was detected by the Google Cloud Cloud Translation API.
          #
          # @return [Boolean] `true` if the source language was detected by the Cloud Translation API, `false` if the
          #   source language was provided in the request
          def detected?
            @detected
          end

          ##
          # @private New Translation from a TranslationsListResponse object as defined by the Google API Client object.
          def self.from_gapi_list gapi, text, to, from
            res = text.zip(Array(gapi["translations"])).map do |origin, g|
              from_gapi g, to, origin, from
            end
            return res.first if res.size == 1
            res
          end

          ##
          # @private New Translation from a TranslationsResource object as defined by the Google API Client object.
          def self.from_gapi gapi, to, origin, from
            from ||= gapi["detectedSourceLanguage"]
            detected = !gapi["detectedSourceLanguage"].nil?
            new gapi["translatedText"], to, origin, from, gapi["model"], detected
          end
        end
      end
    end
  end
end
