# frozen_string_literal: true

# 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
#
#     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.


require "google/cloud/bigtable/gc_rule"

module Google
  module Cloud
    module Bigtable
      ##
      # # ColumnFamily
      #
      # A set of columns within a table that share a common configuration.
      #
      # @example
      #   require "google/cloud/bigtable"
      #
      #   bigtable = Google::Cloud::Bigtable.new
      #
      #   instance = bigtable.instance("my-instance")
      #   table = instance.table("my-table")
      #
      #   column_family = table.column_families["cf2"]
      #   puts column_family.gc_rule
      #
      class ColumnFamily
        # Name of the column family
        # @return [String]
        attr_reader :name

        # The garbage collection rule to be used for the column family.
        # Optional. The service default value will be used when not specified.
        # @return [Google::Cloud::Bigtable::GcRule, nil]
        attr_accessor :gc_rule

        # @private
        def initialize name, gc_rule: nil
          @name = name
          @gc_rule = gc_rule
        end

        # @private
        # @return [Google::Bigtable::Admin::V2::ColumnFamily]
        def to_grpc
          grpc = Google::Bigtable::Admin::V2::ColumnFamily.new
          grpc.gc_rule = gc_rule.to_grpc if gc_rule
          grpc
        end

        # @private
        #
        # Create a new ColumnFamily instance from a {Google::Bigtable::Admin::V2::ColumnFamily}.
        #
        # @param grpc [Google::Bigtable::Admin::V2::ColumnFamily]
        # @param name [String] Column family name
        # @return [Google::Cloud::Bigtable::ColumnFamily]
        #
        def self.from_grpc grpc, name
          new(name).tap do |cf|
            cf.gc_rule = GcRule.from_grpc grpc.gc_rule if grpc.gc_rule
          end
        end
      end
    end
  end
end