class MoveWeeklyTasks < ActiveRecord::Migration[4.2]
  def up
    Workgroup.where(weekly_task: true).each do |workgroup|
      task_group = PeriodicTaskGroup.create
      puts "Moving weekly task for workgroup #{workgroup.name} to group #{task_group.id}"
      workgroup.tasks.undone.each do |task|
        task.update_column(:periodic_task_group_id, task_group.id) if weekly_task?(workgroup, task)
      end
      tasks = task_group.tasks.order(:due_date)
      task_group.next_task_date = tasks.last.due_date + PeriodicTaskGroup::PeriodDays unless tasks.empty?
      task_group.save!
      puts "Associated #{tasks.count} tasks with group and set next_task_date to #{task_group.next_task_date}"
    end
  end

  def down
    PeriodicTaskGroup.all.each do |task_group|
      next if task_group.tasks.empty?

      task = task_group.tasks.first
      workgroup = task.workgroup
      puts "Writing task data of group #{task_group.id} to workgroup #{workgroup.name}"
      workgroup_attributes = {
        weekly_task: true,
        weekday: task.due_date.days_to_week_start(:sunday),
        task_name: task.name,
        task_description: task.description,
        task_required_users: task.required_users,
        task_duration: task.duration
      }
      workgroup.update(workgroup_attributes)
      task_group.tasks.update_all weekly: true
    end
  end

  private

  def weekly_task?(workgroup, task)
    return false if task.due_date.nil?

    group_task = {
      weekday: workgroup.weekday,
      name: workgroup.task_name,
      description: workgroup.task_description,
      required_users: workgroup.task_required_users,
      duration: workgroup.task_duration,
      weekly: true,
      done: false,
      workgroup_id: workgroup.id
    }
    task_task = {
      weekday: task.due_date.days_to_week_start(:sunday),
      name: task.name,
      description: task.description,
      required_users: task.required_users,
      duration: task.duration,
      weekly: task.weekly,
      done: task.done,
      workgroup_id: task.workgroup_id
    }
    group_task == task_task
  end
end
