# frozen_string_literal: true

# A subscription extended for free, added to the shopping cart
class CartItem::FreeExtension < CartItem::BaseItem
  def initialize(customer, subscription, new_expiration_date)
    raise TypeError unless subscription.is_a? Subscription

    @customer = customer
    @new_expiration_date = new_expiration_date
    @subscription = subscription
    super
  end

  def start_at
    raise InvalidSubscriptionError if @subscription.nil?
    if @new_expiration_date.nil? || @new_expiration_date <= @subscription.expired_at
      raise InvalidSubscriptionError, I18n.t('cart_items.must_be_after_expiration')
    end

    @subscription.expired_at
  end

  def price
    elements = { OfferDay: 0 }

    { elements: elements, amount: 0 }
  end

  def name
    I18n.t('cart_items.free_extension', DATE: I18n.l(@new_expiration_date))
  end

  def to_object
    ::OfferDay.new(
      subscription_id: @subscription.id,
      start_at: start_at,
      end_at: @new_expiration_date
    )
  end

  def type
    'subscription'
  end
end