// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

import 'package:fidl_fuchsia_modular/fidl_async.dart' as modular;
import 'package:fidl_fuchsia_xi_session/fidl_async.dart';
import 'package:fuchsia_scenic_flutter/child_view_connection.dart'
    show ChildViewConnection;
import 'package:fuchsia_logger/logger.dart';
import 'package:fuchsia_modular/module.dart';
import 'package:fuchsia_modular/service_connection.dart';
import 'package:lib.widgets.dart/model.dart';

const String kSessionManagerURL =
    'fuchsia-pkg://fuchsia.com/xi_session_agent#meta/xi_session_agent.cmx';

class DemoModel extends Model {
  final List<String> messages = [
    'Hello!',
    'This is pretending to be a messaging app.',
    'Press "+" to open a compose view',
    'Then press "send" to add a new message.',
  ];

  final _sessionManagerProxy = XiSessionManagerProxy();
  XiSessionManager get sessionManager => _sessionManagerProxy;

  DemoModel() {
    connectToAgentService(kSessionManagerURL, _sessionManagerProxy);
  }

  modular.ModuleController editorController;
  ChildViewConnection _editorConn;
  ChildViewConnection get editorConn => _editorConn;

  set editorConn(ChildViewConnection editorConn) {
    log.fine('Setting child editor view connection to $editorConn');
    _editorConn = editorConn;
    notifyListeners();
  }

  /// The session identifier for the active editing session.
  String _activeSession;

  /// `true` iff we are showing the modal 'compose' view.
  bool showingModal = false;

  /// Creates a new xi session, and starts embeddable_xi as a child mod
  /// in a new modal view.
  void composeButtonAction() async {
    _activeSession = await requestSessionId();
    await connectXiModule(_activeSession);
    log.info('connecting session $_activeSession');
    showingModal = true;
    notifyListeners();
  }

  /// Fetches the contents of the modal view from the agent, adds them
  /// as a new message to the messages list, and dismisses the modal.
  void sendButtonAction() async {
    log.info('requesting contents for $_activeSession');

    final vmo = await sessionManager.getContents(_activeSession);
    final newMessage = vmo.read(vmo.getSize().size).bytesAsUTF8String();

    messages.add(newMessage);
    if (editorController != null) {
      await editorController.stop();
    }
    _editorConn = null;
    showingModal = false;
    notifyListeners();
  }

  /// Requests a new session id from the xi session agent service.
  Future<String> requestSessionId() => sessionManager.newSession();

  Future<void> connectXiModule(String sessionId) async {
    final entity = await Module()
        .createEntity(type: 'string', initialData: utf8.encode(sessionId));

    final intent = Intent(
        action: '',
        handler:
            'fuchsia-pkg://fuchsia.com/xi_embeddable#meta/xi_embeddable.cmx')
      ..addParameterFromEntityReference(
          'session-id', await entity.getEntityReference());

    final embeddedModule =
        await Module().embedModule(name: 'xi_embeddable', intent: intent);

    _editorConn = ChildViewConnection(embeddedModule.viewHolderToken);
    editorController = embeddedModule.moduleController;
  }
}
