package com.ragnarok.rxcamera.request;

import android.hardware.Camera;
import android.util.Log;

import com.ragnarok.rxcamera.RxCamera;
import com.ragnarok.rxcamera.RxCameraData;
import com.ragnarok.rxcamera.error.FaceDetectionNotSupportError;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action0;

/**
 * Created by ragnarok on 16/6/5.
 */
public class FaceDetectionRequest extends BaseRxCameraRequest implements Camera.FaceDetectionListener {

    private Subscriber<? super RxCameraData> subscriber;

    public FaceDetectionRequest(RxCamera rxCamera) {
        super(rxCamera);
    }

    @Override
    public Observable<RxCameraData> get() {
        return Observable.create(new Observable.OnSubscribe<RxCameraData>() {
            @Override
            public void call(Subscriber<? super RxCameraData> subscriber) {
                if (rxCamera.getNativeCamera().getParameters().getMaxNumDetectedFaces() > 0) {
                    FaceDetectionRequest.this.subscriber = subscriber;
                } else {
                    subscriber.onError(new FaceDetectionNotSupportError("Camera not support face detection"));
                }
            }
        }).doOnSubscribe(new Action0() {
            @Override
            public void call() {
                rxCamera.getNativeCamera().setFaceDetectionListener(FaceDetectionRequest.this);
                rxCamera.getNativeCamera().startFaceDetection();
            }
        }).doOnUnsubscribe(new Action0() {
            @Override
            public void call() {
                rxCamera.getNativeCamera().setFaceDetectionListener(null);
                rxCamera.getNativeCamera().stopFaceDetection();
            }
        });
    }

    @Override
    public void onFaceDetection(Camera.Face[] faces, Camera camera) {
        if (subscriber != null && !subscriber.isUnsubscribed() && rxCamera.isOpenCamera()) {
            RxCameraData cameraData = new RxCameraData();
            cameraData.faceList = faces;
            subscriber.onNext(cameraData);
        }
    }
}