//import 'dart:html';
//import 'package:http/http.dart';

import 'dart:io';
import 'dart:convert';
import 'clientportalapi.dart';
import 'AccessRight/accessrightmodels.dart';
import 'MarketData/marketdatamodels.dart';

// NOTE: This is SAMPLE test project only. It's just to test simple functionality of ClientPortalApi
// and Price Update throgh sockets, please write your own application base on ideas here.
// DO NOT USE AS IS OR ANY MEANS FOR PRACTICAL APPLICATION.

class Test1
{
    ClientPortalApi obj;
    String targetAccNo = 'TEST';
    String userAccName = 'ADMIN';
    String userAccPass = 'pass';
    String targetSysId = 'SYS_F';    

    void OnLogin(LoginRespData data)
    {
        print('LOGGED IN');
        print(jsonEncode(data));
    }

    void OnLogout()
    {
        if (obj.IsLoggedIn())
        {          
            obj.accessRight.SessionTokenHeartbeat().whenComplete(() => null);
            obj.accessRight.UserLogout().whenComplete(() => null);
        }
    }

    void StartIt()
    {
        obj = new ClientPortalApi();
        var dd = obj.accessRight.UserLogin(userAccName, userAccPass);
        dd.then((value) => OnLogin(value));
    }

    void GetPrice() async
    {
        if (!obj.IsLoggedIn())
            return;

        var channels = ['MarketData'];
        obj.SubscibeChannels(channels);
        obj.marketData.OnPriceResp = OnPriceUpdate;

        // offer some lead time connect to socket
        await Future.delayed(Duration(seconds: 2));

        var prodCodes = ['HSIN1'];
        obj.marketData.SubcribePrice(prodCodes);   
    }

    void GetTicker() async
    {
        if (!obj.IsLoggedIn())
            return;

        var channels = ['MarketData'];
        obj.SubscibeChannels(channels);
        obj.marketData.OnTickerResp = OnTickerUpdate;

        // offer some lead time connect to socket
        await Future.delayed(Duration(seconds: 2));

        var prodCodes = ['HSIN1'];
        obj.marketData.SubcribeTicker(prodCodes);
    }

    void OnPriceUpdate(PriceResponse resp)
    {
        print(jsonEncode(resp));
    }

    void OnTickerUpdate(TickerResponse resp)
    {
        print(jsonEncode(resp));
    }    
}

void main() async
{ 
    var t = Test1(); 
    t.StartIt(); 
    await Future.delayed(Duration(seconds: 2));

    // sample to display price, bid/ask/last, OHLC
    t.GetPrice();
    await Future.delayed(Duration(seconds: 10));

    // sample to display Ticker
    //t.GetTicker();
    //await Future.delayed(Duration(seconds: 10));

    // wait for ENTER then logout
    // somehow/maybe doesnt work, need to CTRL-C to terminate
    //stdin.readLineSync();

    t.OnLogout();
}