import 'dart:async';
import 'dart:convert' show UTF8;

import 'package:sky/mojo/embedder.dart' show embedder;
import 'package:sky/widgets.dart';

import 'package:ether/echo_client.dart' show EchoClient;
import 'package:ether/syncbase_client.dart'
    show Perms, SyncbaseClient, SyncbaseTable;

log(String msg) {
  DateTime now = new DateTime.now();
  print('$now $msg');
}

Perms emptyPerms() => new Perms()..json = '{}';

class DemoApp extends App {
  final EchoClient _echoClient;
  final SyncbaseClient _syncbaseClient;

  DemoApp()
      : _echoClient = new EchoClient(
            embedder.connectToService, 'https://mojo.v.io/echo_server.mojo'),
        _syncbaseClient = new SyncbaseClient(embedder.connectToService,
            'https://mojo.v.io/syncbase_server.mojo');

  int seq = 0;
  SyncbaseTable tb;
  String sendMsg, recvMsg, putStr, getStr;

  Future doEcho() async {
    log('DemoApp.doEcho');

    setState(() {
      sendMsg = seq.toString();
      recvMsg = '';
    });
    seq++;
    log('setState sendMsg done');

    String recvMsgAsync = await _echoClient.echo(sendMsg);

    setState(() {
      recvMsg = recvMsgAsync;
    });
    log('setState recvMsg done');
  }

  Future doSyncbaseInit() async {
    log('DemoApp.doSyncbaseInit');
    if (tb != null) {
      log('syncbase already initialized');
      return;
    }
    // TODO(sadovsky): Handle "already exists" case.
    var app = _syncbaseClient.app('app');
    await app.create(emptyPerms());
    var db = app.noSqlDatabase('db');
    await db.create(emptyPerms());
    var table = db.table('table');
    await table.create(emptyPerms());
    tb = table;
    log('syncbase is now initialized');
  }

  Future doPutGet() async {
    log('DemoApp.doPutGet');
    await doSyncbaseInit();

    setState(() {
      putStr = seq.toString();
      getStr = '';
    });
    seq++;
    log('setState putStr done');

    // TODO(sadovsky): Switch to tb.put/get once they exist.
    var row = tb.row('key');
    await row.put(UTF8.encode(putStr));
    var getBytes = await row.get();

    setState(() {
      getStr = UTF8.decode(getBytes);
    });
    log('setState getStr done');
  }

  // TODO(sadovsky): I don't think Sky calls App.close().
  Future close({bool immediate: false}) async {
    log('DemoApp.close');
    await _echoClient.close(immediate: immediate);
    await _syncbaseClient.close(immediate: immediate);
  }

  Widget build() {
    return new Container(
        decoration:
            const BoxDecoration(backgroundColor: const Color(0xFF00ACC1)),
        child: new Flex([
          new RaisedButton(child: new Text('doEcho'), onPressed: doEcho),
          new Text('sendMsg: $sendMsg'),
          new Text('recvMsg: $recvMsg'),
          new RaisedButton(child: new Text('doPutGet'), onPressed: doPutGet),
          new Text('putStr: $putStr'),
          new Text('getStr: $getStr')
        ], direction: FlexDirection.vertical));
  }
}

void main() {
  runApp(new DemoApp());
}
