# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
module InsertDuplicate
  def self.campaign(campaign_id, profile_id)
    ParamValidation.new({:campaign_id => campaign_id, :profile_id => profile_id},
    {
      :campaign_id => {:required => true, :is_integer => true},
      :profile_id => {:required => true, :is_integer => true}
    })
    campaign = Campaign.where("id = ?", campaign_id).first
    unless campaign
      raise ParamValidation::ValidationError.new("#{campaign_id} is not a valid campaign", {:key => :campaign_id})
    end

    profile = Profile.where("id = ?", profile_id).first
    unless profile
      raise ParamValidation::ValidationError.new("#{profile_id} is not a valid profile", {:key =>:profile_id})
    end

    Qx.transaction do
      dupe = campaign.dup

      dupe.slug = SlugCopyNamingAlgorithm.new(Campaign, dupe.nonprofit.id).create_copy_name(dupe.slug)
      dupe.name = NameCopyNamingAlgorithm.new(Campaign, dupe.nonprofit.id).create_copy_name(dupe.name)
      if (dupe.end_datetime && dupe.end_datetime.ago(7.days) < DateTime.now)
        dupe.end_datetime = DateTime.now.since(7.days)
      end

      dupe.published = false

      dupe.save!

      dupe.update_attribute(:main_image, campaign.main_image) unless !campaign.main_image rescue AWS::S3::Errors::NoSuchKey

      dupe.update_attribute(:background_image, campaign.background_image) unless !campaign.background_image rescue AWS::S3::Errors::NoSuchKey

      InsertDuplicate.campaign_gift_options(campaign_id, dupe.id)

      return dupe
    end
  end

  def self.event(event_id, profile_id)
    ParamValidation.new({:event_id => event_id, :profile_id => profile_id},
                        {
                            :event_id => {:required => true, :is_integer => true},
                            :profile_id => {:required => true, :is_integer => true}
                        })
    event = Event.where("id = ?", event_id).first
    unless event
      raise ParamValidation::ValidationError.new("#{event_id} is not a valid event", {:key => :event_id})
    end

    profile = Profile.where("id = ?", profile_id).first
    unless profile
      raise ParamValidation::ValidationError.new("#{profile_id} is not a valid profile", {:key =>:profile_id})
    end

    Qx.transaction do
      dupe = event.dup

      dupe.slug = SlugCopyNamingAlgorithm.new(Event, dupe.nonprofit.id).create_copy_name(dupe.slug)
      dupe.name = NameCopyNamingAlgorithm.new(Event, dupe.nonprofit.id).create_copy_name(dupe.name)

      we_changed_start_time = false

      length_of_event =  dupe.end_datetime - dupe.start_datetime
      if (dupe.start_datetime.ago(7.days) < DateTime.now)
        dupe.start_datetime = DateTime.now.since(7.days)
        we_changed_start_time = true
      end

      if (we_changed_start_time && dupe.end_datetime)
        dupe.end_datetime = dupe.start_datetime.since(length_of_event)
      end


      dupe.published = false

      dupe.save!

      dupe.update_attribute(:main_image, event.main_image) unless !event.main_image rescue AWS::S3::Errors::NoSuchKey

      dupe.update_attribute(:background_image, event.background_image) unless !event.background_image rescue AWS::S3::Errors::NoSuchKey

      InsertDuplicate.ticket_levels(event_id, dupe.id)
      InsertDuplicate.event_discounts(event_id, dupe.id)

      return dupe
    end
  end

  # selects all gift options associated with old campaign
  # and inserts them and creates associations with a new campaign
  def self.campaign_gift_options(old_campaign_id, new_campaign_id)
    cgos = Qx.select("*")
      .from("campaign_gift_options")
      .where(campaign_id: old_campaign_id)
      .execute
      .map {|c| c.except("id", "created_at", "updated_at", "campaign_id") }

    if cgos.any?
      return Qx.insert_into("campaign_gift_options")
        .values(cgos)
        .common_values({campaign_id: new_campaign_id})
        .ts
        .returning("*")
        .execute
    end
  end

  # selects all ticket levels associated with old event
  # and inserts them and creates associations with a new event
  def self.ticket_levels(old_event_id, new_event_id)
    tls = Qx.select("*")
      .from("ticket_levels")
      .where(event_id: old_event_id)
      .execute
      .map {|t| t.except("id", "created_at", "updated_at", "event_id") }

    if tls.any?
      return Qx.insert_into("ticket_levels")
        .values(tls)
        .common_values({event_id: new_event_id})
        .ts
        .returning("*")
        .execute
    end
  end

  # selects all discounts associated with old event
  # and inserts them and creates associations with a new event
  def self.event_discounts(old_event_id, new_event_id)
    eds = Qx.select("*")
              .from("event_discounts")
              .where(event_id: old_event_id)
              .execute
              .map {|t| t.except("id", "created_at", "updated_at", "event_id") }

    if eds.any?
      return Qx.insert_into("event_discounts")
                 .values(eds)
                 .common_values({event_id: new_event_id})
                 .ts
                 .returning("*")
                 .execute
    end
  end
end