
import {Log} from "fme-logger";
var L = new Log("FreeBarchart");
import * as _m from "moment-timezone";
import * as request from "request-promise-native";

interface EsQuote {

}
interface History {

}



function convert (x:any) {
    var obj:any = {};
    obj.symbol = x.symbol;
    obj.date = _m(x.timestamp).format("YYYYMMDD");
    obj.time = _m(x.timestamp).format("HHmm");
    obj.timeNumber = _m(x.timestamp).hours()*60+_m(x.timestamp).minutes();
    obj.open = x.open;
    obj.close = x.close;
    obj.high = x.high;
    obj.low = x.low;
    obj.volume = x.volume;
    return obj
}

export class FreeBarchart {
    version = "1.0.0";
    host = "marketdata.websol.barchart.com";
    endpoint = "getHistory.json";
 //   symbol = "ES*1";
    symbol = "SPY";
    type = "minutes";
    types = ["ticks", "minutes", "nearbyMinutes", "formTMinutes", "daily", "dailyNearest", "dailyContinue", "weekly", "weeklyNearest",
    "weeklyContinue", "monthly", "monthlyNearest", "monthlyContinue", "quarterly", "quarterlyNearest", "quarterlyContinue", "yearly",
    "yearlyNearest", "yearlyContinue"];
    typesSingleDay = ["ticks","minutes","nearbyMinutes","formTMinutes"];
    interval = 1;

    //
    // @KEY = FREE BARCHART KEY STRING
    // @SYMBOL = BARCHART SYMBOL
    // @FRAME = TIMEFRAME = "minute","day","week"
    // @Interval = number (1,2,3) (combines with FRAME to complete the reqeust);
    //

    constructor(private key:string,symbol:string,frame:string,interval:number) {
        this.symbol = symbol;
        this.type = frame.toLowerCase().trim();
        
        if (this.types.indexOf(this.type) == -1 ) {
            L.error("Invalid type passed",this.types,"valid types are",JSON.stringify(this.types))
            return;
        }

        if (!interval) this.interval = 1; else this.interval = interval;;
    }

    

    getDailyMinutes = async (sDate:Date) => {
        var type = this.type.trim().toLowerCase();
        var symbol = this.symbol.trim().toLowerCase();
        
       
        
        var startDate = _m(sDate).format("YYYYMMDD");
        
        var req = "/"+this.endpoint+"?key="+this.key+"&symbol="+this.symbol+"&type="+type+"&startDate="+startDate+"&interval="+this.interval;
        var fullUrl = "http://"+this.host+req
        L.info("requesting:",fullUrl);
        var rtn = JSON.parse(await request(fullUrl)).results; 
       // L.info("Rtn is",rtn);
        var filter = {};
        if (this.typesSingleDay.indexOf(type) > -1) {
            filter = rtn.filter((x:any) =>{return _m(x.timestamp).format("YYYYMMDD") == _m(sDate).format("YYYYMMDD")} ).map(convert);
        } else {
            filter = rtn.filter.map(convert);
        }
        return filter;
    }


}

  /*  
    function convertNinjaDT (dt) {
        if (dt.length < 5) return;
        var d = dt.split(" ")[0];
        var t = dt.split(" ")[1];
        var YYYY = d.substring(0,4);
        var MM = d.substring(4,6)-1;
        var DD = d.substring(6,8);
        var HH = t.substring(0,2);
        var mm = t.substring(2,4);
        var ss = "00";
        
        var tsMM = (MM + 1).toString();
        if (tsMM.length < 2) tsMM = "0"+tsMM;
        var time = HH+mm+ss;
        var date = YYYY+tsMM+DD;
        //    L.info (YYYY,MM,DD,HH,mm,ss);
        return  ( {timestamp : new Date (YYYY,MM,DD,HH,mm,ss),time:time,date:date});
    }
    
    
//
// Barchart API for access historic ES data to keep our database current
//  
barchart = {};
var http = require('http');


barchart.getES = function (sDate,CB) {
    var dt = new Date();
    var YYYY = dt.getFullYear().toString();
    var MM = (dt.getMonth()+1).toString();
    var DD = dt.getDate().toString();
    var startDate = sDate;
    var type = "minutes";
    var host = "marketdata.websol.barchart.com";
    var endpoint = "getHistory.json";
    var symbol = "ES*1";
//
// ===> create full request URL
//
    var req = "/"+endpoint+"?key="+barchart.key+"&symbol="+symbol+"&type="+type+"&startDate="+startDate;
//
// ===> Make the request, chunk the results and call back the passed in function
//    
    L.info ("calling barchart with url",host,req);
    http.get({
        host:host,
        path:req
    },function(response){
        var body ="";
        response.on("data",function(d){
          
            body += d;
        });
        response.on("end",function(){
            
            parsed=JSON.parse(body);
      //      L.info("got and end",parsed);
            barchart.storeES(parsed); // <== hand off to be stored
        });
        response.on('error', function(err) {
            L.error("Error during HTTP request");
            L.error(err.message);
        });
    })
}
 */
       