# bundle exec rake sync:public_message args=149,2903
namespace :sync do
  task :public_message => :environment do
    subject_id = ENV['args'].split(",")[0] # 对应课程的id
    shixun_id = ENV['args'].split(",")[1] # 对应课程的id
    board_id = ENV['args'].split(",")[2]
    message_id = ENV['args'].split(",")[3]
    status = ENV['args'].split(",")[4] # 表示相应的期数

    if status.to_i == 1
      start_time = '2018-12-16'
      end_time = '2019-04-01'
    elsif status.to_i == 2
      start_time = '2019-04-07'
      end_time = '2019-07-28'
    else
      # 这种情况是取所有的
      start_time = '2015-01-01'
      end_time = '2022-07-28'
    end

    shixun_ids = Shixun.find_by_sql("select shixun_id from stage_shixuns where stage_id in (select id from stages where
                                     subject_id=#{subject_id}) ").map(&:shixun_id)

    discusses = Discuss.where(dis_id: shixun_ids).where("created_at >? and created_at <?", start_time, end_time)
    if discusses.present?
      discusses.find_each do |discuss|
        puts discuss.user_id
        puts board_id
        puts message_id
        new_message = Message.create!(board_id: board_id.to_i, author_id: discuss.user_id, parent_id: message_id, root_id: message_id)
        MessageDetail.create!(message_id: new_message.id, content: discuss.try(:content))
      end
    end
  end

  task :sigle_message => :environment do
    subject_id = ENV['args'].split(",")[0] # 对应课程的id
    shixun_id = ENV['args'].split(",")[1] # 对应课程的id
    board_id = ENV['args'].split(",")[2]
    message_id = ENV['args'].split(",")[3]
    status = ENV['args'].split(",")[4] # 表示相应的期数

    if status.to_i == 1
      start_time = '2018-12-16'
      end_time = '2019-04-01'
    elsif status.to_i == 2
      start_time = '2019-04-07'
      end_time = '2019-07-28'
    else
      # 这种情况是取所有的
      start_time = '2015-01-01'
      end_time = '2022-07-28'
    end

    if subject_id.to_i == -1
      discusses = Discuss.where("parent_id is null and dis_id=?", shixun_id)
    else
      shixun_ids = Shixun.find_by_sql("select shixun_id from stage_shixuns where stage_id in (select id from stages where
                                       subject_id=#{subject_id}) ").map(&:shixun_id)
      discusses = Discuss.where("parent_id is null").where(dis_id: shixun_ids)
    end

    discusses.each do |discuss|
      rand_created_on = random_time start_time, end_time
      puts discuss.id
      # 找到所有的子回复
      replies = Discuss.where(parent_id: discuss.id)

      # 如果有子回复，除了创建父回复外，还需要同步子回复
      new_message = Message.create!(board_id: board_id.to_i, author_id: discuss.user_id, parent_id: message_id, root_id: message_id)
      new_message.update_columns(created_on: rand_created_on, updated_on: rand_created_on)
      message_detail = MessageDetail.create!(message_id: new_message.id, content: discuss.try(:content))
      message_detail.update_columns(created_at: rand_created_on, updated_at: rand_created_on)
      if replies.present?
        replies.each do |reply|
          puts("reply id si #{reply.id}")
          reply_time = random_time(start_time, end_time)
          while reply_time > rand_created_on
            reply_time = random_time(start_time, end_time)
          end

          reply_message = Message.create!(board_id: board_id.to_i, author_id: reply.user_id, parent_id: new_message.id, root_id: message_id)
          reply_message.update_columns(created_on: reply_time, updated_on: reply_time)
          reply_message_detail = MessageDetail.create!(message_id: reply_message.id, content: reply.try(:content))
          reply_message_detail.update_columns(created_at: rand_created_on, updated_at: rand_created_on)
        end
      end
    end


    def min_swith(time)
      puts time
      return time < 9 ? "0#{time}" : time
    end

    def random_time(start_time, end_time)
      hour = (6..23).to_a.sample(1).first
      min = rand(60)
      sec = rand(60)

      start_time = Date.parse(start_time)
      end_time = Date.parse(end_time)
      date = (start_time..end_time).to_a.sample(1).first

      time = "#{date} #{min_swith(hour)}:#{min_swith(min)}:#{min_swith(sec)}"

      puts time
      time
    end

    # 子评论的时间必须小于父评论
    def smaller_time(parent_time, start_time, end_time)
      large_time = random_time(start_time, end_time)
      while large_time > parent_time
        large_time = random_time(start_time, end_time)
      end
      large_time
    end
  end

  task :board_count => :environment do
    Course.find_each do |course|
      puts course.id

      begin
        messages_count = Message.find_by_sql("select count(*) as count from messages where board_id in (select id from boards where course_id=#{course.id})").first.try(:count)

        Board.update_column(messages_count: messages_count)
      rescue

      end

    end
  end
end
