class EmailSubscription < ApplicationRecord
  EMAIL_LEVEL_MAX = 3
  EMAIL_LEVEL_UNSUBSCRIBED = 0
  EMAIL_LEVEL_INVALID = -1
  EMAIL_LEVEL_BOUNCES = -2

  has_many :email_transactions
  belongs_to :user, polymorphic: true

  def can_level_up
    self.level < EmailSubscription::EMAIL_LEVEL_MAX
  end

  def can_level_down
    self.level > EmailSubscription::EMAIL_LEVEL_UNSUBSCRIBED
  end

  def less_url
    "#{ENV["HOST"]}/email_subscriptions/#{self.token}/less"
  end

  def more_url
    "#{ENV["HOST"]}/email_subscriptions/#{self.token}/more"
  end

  def unsubscribe_url
    "#{ENV["HOST"]}/email_subscriptions/#{self.token}/unsubscribe"
  end

  def mute_url_for_campaign(campaign)
    "#{ENV["HOST"]}/email_subscriptions/#{self.token}/mute/#{campaign.id}"
  end

  def muted_campaigns
    if self.muted_campaigns_json != nil
      return JSON.parse(self.muted_campaigns_json)
    else
      return []
    end
  end

  def mute_campaign(campaign)
    muted = self.muted_campaigns
    if !muted.include? campaign.id
      muted.push(campaign.id)
    end
    self.muted_campaigns_json = muted.to_json
  end

  def is_campaign_muted(campaign)
    return self.muted_campaigns.include? campaign.id
  end

  def self.create_for_user(user)
    subscription = EmailSubscription.new
    subscription.user = user
    subscription.level = EmailSubscription::EMAIL_LEVEL_MAX
    subscription.token = Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))
    subscription.save
    subscription
  end
end