class GHBlog {

constructor(user, repo) {
  this.API_URL = 'https://api.github.com';
  this.POSTS_URL = `${this.API_URL}/repos/${user}/${repo}/contents/posts`;
  this.COMMITS_URL = `${this.API_URL}/repos/${user}/${repo}/commits?path=`;
}

getPosts() {
  return fetch(this.POSTS_URL)
    .then(result => result.json())
    .then(infos => Promise.all(infos.map(this.loadPost.bind(this))));
  }

loadPost(info) {
  const loadedSha = localStorage[`${info.path}-sha`];
  if(loadedSha && loadedSha == info.sha) {
    return Promise.resolve({path: info.path, sha: info.sha});
  } else {
    return Promise.all([
        this.fetchPost(info.url),
        this.fetchCommits(info.path)
      ]).then(results => {
        const [html, commits] = results;
        localStorage[`${info.path}-sha`] = info.sha;
        return {html, commits, path: info.path, sha: info.sha, updated: true};
      });
  }
}

fetchPost(url) {
  return fetch(url, {
      headers: {
        accept: 'application/vnd.github.v3.html+json'
      }
    }).then(result => result.text());
}

fetchCommits(path) {
  return fetch(`${this.COMMITS_URL}${path}`)
    .then(result => result.json())
    .then(commits => {
      const created = commits[commits.length - 1].commit.author.date;
      const updated = commits[0].commit.author.date;
      return {
        created: new Date(created).toLocaleString(),
        updated: new Date(updated).toLocaleString()
      };
    });
}

}