package com.nairbspace.octoandroid.data.net.stream;

import com.nairbspace.octoandroid.data.db.PrinterDbEntity;
import com.nairbspace.octoandroid.data.disk.DbHelper;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

import javax.inject.Inject;
import javax.inject.Singleton;

import rx.Observable;
import rx.Subscriber;
import rx.exceptions.Exceptions;

@Singleton
public class WebcamManagerImpl implements WebcamManager {

    private final DbHelper mDbHelper;

    @Inject
    public WebcamManagerImpl(DbHelper dbHelper) {
        mDbHelper = dbHelper;
    }

    public Observable<MjpegInputStream> connect() {
        return Observable.create(new Observable.OnSubscribe<MjpegInputStream>() {
            @Override
            public void call(Subscriber<? super MjpegInputStream> subscriber) {
                try {
                    PrinterDbEntity printerDbEntity = mDbHelper.getActivePrinterDbEntity();
                    URL url = new URL(getStreamUrl(printerDbEntity));
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    InputStream inputStream = urlConnection.getInputStream();
                    subscriber.onNext(new MjpegInputStream(inputStream));
                    subscriber.onCompleted();
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        }).retry();
    }

    private String getStreamUrl(PrinterDbEntity printerDbEntity) {
        String scheme = printerDbEntity.getScheme();
        String host = printerDbEntity.getHost();
        int port = printerDbEntity.getPort();
        String pathQuery = printerDbEntity.getWebcamPathQuery();

        try {
            return new URI(scheme, null, host, port, null, null, null).toString() + pathQuery;
        } catch (URISyntaxException e) {
            throw Exceptions.propagate(new URISyntaxException(e.getInput(), e.getReason()));
        }
    }
}