require 'json'
require 'pry'

module Pokrovsky
  class Historiograph
    attr_accessor :repo
    attr_reader :user, :max_commits

    include Enumerable

    def initialize json, user, repo
      @json             = JSON.parse(json)['data']
      @width            = @json[0].length
      @user             = user
      @repo             = repo
      @start_date       = get_start_date
      @current_calendar = get_current_calendar

      populate
    end

    def populate
      @days = []
      date  = get_start_date
      @width.times do |i|
        @json.each do |row|
          if row[i] != 0
            nice_date = date.strftime "%F"
            @days << Pokrovsky::Day.new(
                nice_date,
                row[i],
                get_max_commits,
                @current_calendar[nice_date]
            )
          end
          date += 1
        end
      end
    end

    def get_start_date
      year_ago = Date.parse(Time.new.to_s) - 365
      offset   = ((52 - @width) / 2) * 7

      start_date = year_ago + offset
      while not start_date.sunday?
        start_date += 1
      end
      start_date
    end

    def [] index
      @days[index]
    end

    def length
      @days.length
    end

    def get_max_commits
      (@current_calendar.map { |k, v| v }).max
    end

    def get_current_calendar
    url       = 'https://github.com/users/%s/contributions' % [
          @user
      ]
      c         = Curl::Easy.new("%s" % url)
    #  c.headers = {
    #      'Accept' => 'application/json'
    #  }
      c.perform

      # I AM JOHN MOTHERFUCKING FRUM
      doc = Nokogiri::HTML c.body_str
      dates = doc.xpath('//rect/@data-date')
      counts = doc.xpath('//rect/@data-count')
      @current_calendar = {}
      dates.count.times do |n|
        date = dates[n].value
        count = counts[n].value.to_i
        @current_calendar[date] = count
      end

#      @current_calendar = {}
#      JSON.parse(c.body_str).each do |pair|
#        d                    = Date.parse(pair[0])
#        k                    = d.strftime "%F"
#        @current_calendar[k] = pair[1]
#      end

      @current_calendar
    end

    def to_s
      s = "" "#!/bin/bash
git init %s
cd %s
touch README.md
git add README.md
" "" % [
          @repo,
          @repo,
          @repo
      ]

      @days.each do |day|
        s << day.to_s
      end

      s << "" "git remote add origin git@github.com:%s/%s.git
git pull
git push -u origin master
" "" % [
          @user,
          @repo
      ]
      s
    end
  end
end
