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

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

package io.baku.examples.distro;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;

import org.chromium.base.PathUtils;

import java.io.File;

import io.flutter.view.FlutterMain;
import io.flutter.view.FlutterView;
import io.v.v23.verror.EndOfFileException;

public class HostActivity extends Activity {
    public static final String SESSION_EXTRA = "Session";

    private static final String TAG = HostActivity.class.getSimpleName();

    private FlutterView flutterView;
    private DistroAndroidService.Session session;

    private final FutureCallback<State> render = new FutureCallback<State>() {
        @Override
        public void onSuccess(final State state) {
            flutterView.sendToFlutter("updateCast", state.getValue());
            Futures.addCallback(session.stream.recv(), render);
        }

        @Override
        public void onFailure(final Throwable t) {
            if (!(t instanceof EndOfFileException)) {
                Log.e(TAG, "Unexpected error while hosting cast", t);
            }
            finish();
        }
    };

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FlutterMain.ensureInitializationComplete(getApplicationContext(), null);
        setContentView(R.layout.flutter_layout);

        flutterView = (FlutterView) findViewById(R.id.flutter_view);
        File appBundle = new File(PathUtils.getDataDirectory(this),
                FlutterMain.APP_BUNDLE);
        flutterView.runFromBundle(appBundle.getPath(), null);

        flutterView.sendToFlutter("runHost", "", r -> {
            Futures.addCallback(session.stream.recv(), render);
        });

        session = DistroAndroidService.getSession(getIntent().getStringExtra(SESSION_EXTRA));
    }

    @Override
    protected void onPause() {
        super.onPause();
        flutterView.onPause();

        finish();
    }

    @Override
    protected void onResume() {
        super.onResume();
        flutterView.onResume();
    }

    @Override
    protected void onDestroy() {
        if (flutterView != null) {
            flutterView.destroy();
        }

        session.completion.set(null);

        super.onDestroy();
    }
}
