// Copyright 2015 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.

// This example makes use of mojo:camera_roll which is available only when
// running on Android.
//
// Example usage:
//   pub get
//   pub run sky_tools build
//   pub run sky_tools run_mojo --mojo-path=../../.. --android

import 'dart:sky';
import 'dart:typed_data';

import 'package:mojo_services/mojo/camera_roll.mojom.dart';
import 'package:sky/services.dart';

final CameraRollServiceProxy cameraRoll = new CameraRollServiceProxy.unbound();
Image currentImage;
int photoIndex = 0;

Picture paint(Rect paintBounds) {
  PictureRecorder recorder = new PictureRecorder();
  Canvas canvas = new Canvas(recorder, paintBounds);
  Paint paint = new Paint()..color = const Color.fromARGB(255, 0, 255, 0);
  if (currentImage != null) {
    canvas.drawImage(currentImage, new Point(0.0, 0.0), paint);
  }
  return recorder.endRecording();
}

Scene composite(Picture picture, Rect paintBounds) {
  final double devicePixelRatio = view.devicePixelRatio;
  Rect sceneBounds = new Rect.fromLTWH(
      0.0, 0.0, view.width * devicePixelRatio, view.height * devicePixelRatio);
  Float32List deviceTransform = new Float32List(16)
    ..[0] = devicePixelRatio
    ..[5] = devicePixelRatio
    ..[10] = 1.0
    ..[15] = 1.0;
  SceneBuilder sceneBuilder = new SceneBuilder(sceneBounds)
    ..pushTransform(deviceTransform)
    ..addPicture(Offset.zero, picture, paintBounds)
    ..pop();
  return sceneBuilder.build();
}

void beginFrame(double timeStamp) {
  Rect paintBounds = new Rect.fromLTWH(0.0, 0.0, view.width, view.height);
  Picture picture = paint(paintBounds);
  Scene scene = composite(picture, paintBounds);
  view.scene = scene;
}

void getPhoto() {
  var future = cameraRoll.ptr.getPhoto(photoIndex);
  future.then((response) {
    if (response.photo == null) {
      print("Photo $photoIndex not found, returning to the first photo.");
      cameraRoll.ptr.update();
      photoIndex = 0;
      getPhoto();
      return;
    }

    new ImageDecoder(response.photo.content.handle.h, (image) {
      if (image != null) {
        currentImage = image;
        print("view.scheduleFrame");
        view.scheduleFrame();
      }
    });
  });
}

bool handleEvent(Event event) {
  if (event.type == 'pointerdown') {
    return true;
  }

  if (event.type == 'pointerup') {
    photoIndex++;
    getPhoto();
    return true;
  }

  return false;
}

void main() {
  embedder.connectToService("mojo:camera", cameraRoll);
  view.setFrameCallback(beginFrame);
  view.setEventCallback(handleEvent);
  getPhoto();
}
