/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.monkeyrunner.easy;

import com.google.common.base.Preconditions;

import com.android.chimpchat.hierarchyviewer.HierarchyViewer;
import com.android.hierarchyviewerlib.models.ViewNode;
import com.android.monkeyrunner.JythonUtils;
import com.android.monkeyrunner.doc.MonkeyRunnerExported;

import org.python.core.ArgParser;
import org.python.core.ClassDictInit;
import org.python.core.PyObject;

/**
 * Select a view object based on some criteria.
 *
 * Currently supports the By.id criteria to search for an element by id.
 * In the future it will support other criteria such as:
 *   By.classid - search by class.
 *   By.hash - search by hashcode
 * and recursively searching under an already selected object.
 *
 * WARNING: This API is under development, expect the interface to change
 * without notice.
 *
 * TODO: Implement other selectors, like classid, hash, and so on.
 * TODO: separate java-only core from jython wrapper
 */
public class By extends PyObject implements ClassDictInit {
    public static void classDictInit(PyObject dict) {
        JythonUtils.convertDocAnnotationsForClass(By.class, dict);
    }

    private String id;

    By(String id) {
        this.id = id;
    }

    @MonkeyRunnerExported(doc = "Select an object by id.",
            args = { "id" },
            argDocs = { "The identifier of the object." })
    public static By id(PyObject[] args, String[] kws) {
        ArgParser ap = JythonUtils.createArgParser(args, kws);
        Preconditions.checkNotNull(ap);

        String id = ap.getString(0);
        return new By(id);
    }

    public static By id(String id) {
        return new By(id);
    }

    public ViewNode findView(HierarchyViewer viewer) {
        return viewer.findViewById(id);
    }


}
