package com.simplbug.sikulimonkey;

import java.awt.AWTException;
import java.awt.Rectangle;

import org.python.core.PyFloat;
import org.python.core.PyObject;
import org.python.core.PyString;
import org.sikuli.script.Debug;
import org.sikuli.script.FindFailed;
import org.sikuli.script.IRobot;
import org.sikuli.script.IScreen;
import org.sikuli.script.Location;
import org.sikuli.script.Region;
import org.sikuli.script.ScreenImage;

import com.android.monkeyrunner.MonkeyDevice;
import com.android.monkeyrunner.MonkeyRunner;

public class AndroidScreen extends AndroidRegion implements IScreen {

    public AndroidScreen(String serialNumber) throws AWTException {
        MonkeyDevice device = MonkeyRunner.waitForConnection(new PyObject[] { new PyFloat(15), new PyString(serialNumber) }, null);

        try { // waitForConnection() never returns null, even the connection cannot be created.
            String model = device.getProperty(new PyObject[] {new PyString("build.model")}, null);
            Debug.history("Successfully connect to a device. MODEL: " + model);
        } catch (Throwable e) {
            throw new RuntimeException("Failed to connect to a device (within timeout).", e);
        }
        _robot = new AndroidRobot(device);

        // Region's default constructor doesn't use this screen as the default one.
        Rectangle bounds = getBounds();
        super.init(bounds.x, bounds.y, bounds.width, bounds.height, this);
    }

    @Override
    public ScreenImage capture() {
        return _robot.captureScreen(getBounds());
    }

    @Override
    public ScreenImage capture(int x, int y, int width, int height) {
        return _robot.captureScreen(new Rectangle(x, y, width, height));
    }

    @Override
    public ScreenImage capture(Rectangle rect) {
        return _robot.captureScreen(rect);
    }

    @Override
    public ScreenImage capture(Region reg) {
        return _robot.captureScreen(reg.getROI());
    }

    @Override
    public Rectangle getBounds() {
        return _robot.getBounds();
    }

    @Override
    public IRobot getRobot() {
        return _robot;
    }

    public <PSRML> int type(String text) throws FindFailed {
        return _robot.type(text);
    }

    @Override
    public Region newRegion(Rectangle rect) {
        return super.newRegion(rect);
    }

    @Override
    public void showClick(Location loc) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void showDropTarget(Location loc) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void showMove(Location loc) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void showTarget(Location loc) {
        throw new UnsupportedOperationException();
    }

}