module Charts
  class Chart
    attr_reader :labels, :total, :success, :project, :build_times

    def initialize(project)
      @labels = []
      @total = []
      @success = []
      @build_times = []
      @project = project

      collect
    end


    def push(from, to, format)
      @labels << from.strftime(format)
      @total << project.builds.
        where('? > builds.created_at AND builds.created_at > ?', to, from).
        count(:all)
      @success << project.builds.
        where('? > builds.created_at AND builds.created_at > ?', to, from).
        success.count(:all)
    end
  end

  class YearChart < Chart
    def collect
      13.times do |i|
        start_month = (Date.today.years_ago(1) + i.month).beginning_of_month
        end_month = start_month.end_of_month

        push(start_month, end_month, "%d %B %Y")
      end
    end
  end

  class MonthChart < Chart
    def collect
      30.times do |i|
        start_day = Date.today - 30.days + i.days
        end_day = Date.today - 30.days + i.day + 1.day

        push(start_day, end_day, "%d %B")
      end
    end
  end

  class WeekChart < Chart
    def collect
      7.times do |i|
        start_day = Date.today - 7.days + i.days
        end_day = Date.today - 7.days + i.day + 1.day

        push(start_day, end_day, "%d %B")
      end
    end
  end

  class BuildTime < Chart
    def collect
      commits = project.commits.joins(:builds).where('builds.finished_at is NOT NULL AND builds.started_at is NOT NULL').last(30)
      commits.each do |commit|
        @labels << commit.short_sha
        @build_times << (commit.duration / 60)
      end
    end
  end
end
