var common = require('./lib/common');
var express = require('express');
var request = require('request');
var async = require('async');
var ejs = require('ejs');
var fs = require('fs');

var app = express();
app.use('/', express.static(__dirname + '/www'));

var NotFound = {Title: '文章没有找到!', Content: '抱歉,您需要的文章没有找到。', Cover: 'img/notfound.png'};


var template = '';
var article_list = './www/files.json';
// init generate static files by www/files.json
var filesNeedInit = common.readJSON(article_list);

loadEjsView('views/article.ejs', function(err, data){
  template = data;
  initStaticHtml();
});

// generate/update file route
app.get('/api/make-html-by-id/:id', function(req, res){
  var article_id = req.params.id;
  generateStaticHtml(article_id, function(err, data){
    refreshCdn()
    res.json(data);
  });

  // update init article list and save
  if ( filesNeedInit.indexOf(article_id) == -1 ) {
    filesNeedInit.push(article_id);
    common.saveJSON(filesNeedInit, article_list);
  }

});

var port = 8080;
app.listen(port);
console.log('Server running at http://127.0.0.1:%s.', port);


// Functions
//

function initStaticHtml(){  // generate static html from www/files.json
  var generatorTasks = [];

  filesNeedInit.forEach(function(id){
    generatorTasks.push(makeStaticHtmlGenerator(id));
  });

  async.parallel(generatorTasks);
  refreshCdn()
}

function makeStaticHtmlGenerator(id, res) { // ( id, res -- generateStaticHtml(id) )
  return function(){
    generateStaticHtml(id, function(err, result){
      console.log(result);
    });
  };
}

function generateStaticHtml(id, callback) { // ( id -- static file)
  var file = 'www/' + id + '.html';

  async.waterfall([
      async.apply(fetchJson, id),
      async.apply(renderToFile, template),
      async.apply(saveFile, file)
    ],
    function(err, result){
      console.log(result);
      callback(null, {result: result});
    }
  );
}

function fetchJson(id, callback) { // (id -- data)
  request('http://api.aiyaopai.com/\?api\=Article.Get\&Id\=' + 
   id + 
   '\&Fields\=Title,Content,Cover', 
    function(err, res, body){
      if(!err && res.statusCode == 200){
        data = JSON.parse(body);
        callback(null, data);
      }
    }
  );
}

function loadEjsView(file, callback) { // (file -- ejsFileString)
  fs.exists(file, function(exists) {
    if(exists) {
      fs.readFile(file, 'utf8', function(err, data) {
        if (err) throw err;
        var ejsFileString = data.toString();
        callback(null, ejsFileString);
      });
    }
  });
}

function renderToFile(templateStr, data, callback){ // (templateStr, data -- html) 
  var html = ejs.render(templateStr, NotFound);
  if(data.Success){
    html = ejs.render(templateStr, data);
  }
  callback(null, html);
}

function saveFile(file, string, callback) { // (file, string -- )
  fs.writeFile(file, string, function(err){
    if(err) throw err;
    console.log('The %s was saved with %d chars.', file, string.length);
    callback(null, {Success: true});
  });
}

function refreshCdn(){
  /**
   * 如果环境变量存在qcloud 的SecretId 和 SecretKey 就认为需要刷新CDN
   * 环境变量需要:
   * QCLOUD_SECRETID : SecretId
   * QCLOUD_SECRETKEY : SecretKey
   * CDNURL : 需要刷新的Url或目录
   */
  var secretId = process.env.QCLOUD_SECRETID;
  var secretKey = process.env.QCLOUD_SECRETKEY;
  var cdnurl = process.env.CDNURL;

  if(secretId && secretKey && cdnurl){
    var QcloudApi = require('./QcloudApi')
    var qcloud = new QcloudApi({
      SecretId: secretId,
      SecretKey: secretKey,
      method: 'GET',
      serviceType:'cdn',
    })
    var params = {
      Region: 'gz',
      Action: 'RefreshCdnDir',
    };
    var cdnurls = cdnurl.split(',');
    cdnurls.forEach(function (item,index) {
      params['dirs.'+ index] = item;
    })
    qcloud.request(params, function(error, data) {
      console.log('Qcloud RefreshCdn result : ' + data);
    })
  }
}