/*
 * Copyright (C) 2018 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 android.view.contentcapture;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.assist.AssistStructure;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.util.Log;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewStructure;
import android.view.ViewStructure.HtmlInfo.Builder;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;

import com.android.internal.util.Preconditions;

//TODO(b/111276913): add javadocs / implement Parcelable / implement
//TODO(b/111276913): for now it's extending ViewNode directly as it needs most of its properties,
// but it might be better to create a common, abstract android.view.ViewNode class that both extend
// instead
/** @hide */
@SystemApi
public final class ViewNode extends AssistStructure.ViewNode {

    private static final String TAG = "ViewNode";

    private AutofillId mParentAutofillId;

    // TODO(b/111276913): temporarily setting some fields here while they're not accessible from the
    // superclass
    private AutofillId mAutofillId;
    private CharSequence mText;
    private String mClassName;

    /** @hide */
    public ViewNode() {
    }

    /**
     * Returns the {@link AutofillId} of this view's parent, if the parent is also part of the
     * screen observation tree.
     */
    @Nullable
    public AutofillId getParentAutofillId() {
        return mParentAutofillId;
    }

    // TODO(b/111276913): temporarily overwriting some methods
    @Override
    public AutofillId getAutofillId() {
        return mAutofillId;
    }
    @Override
    public CharSequence getText() {
        return mText;
    }
    @Override
    public String getClassName() {
        return mClassName;
    }

    /** @hide */
    public static void writeToParcel(@NonNull Parcel parcel, @Nullable ViewNode node, int flags) {
        if (node == null) {
            parcel.writeParcelable(null, flags);
            return;
        }
        parcel.writeParcelable(node.mAutofillId, flags);
        parcel.writeParcelable(node.mParentAutofillId, flags);
        parcel.writeCharSequence(node.mText);
        parcel.writeString(node.mClassName);
    }

    /** @hide */
    public static @Nullable ViewNode readFromParcel(@NonNull Parcel parcel) {
        final AutofillId id = parcel.readParcelable(null);
        if (id == null) return null;

        final ViewNode node = new ViewNode();

        node.mAutofillId = id;
        node.mParentAutofillId = parcel.readParcelable(null);
        node.mText = parcel.readCharSequence();
        node.mClassName = parcel.readString();

        return node;
    }

    /** @hide */
    static final class ViewStructureImpl extends ViewStructure {

        final ViewNode mNode = new ViewNode();

        ViewStructureImpl(@NonNull View view) {
            mNode.mAutofillId = Preconditions.checkNotNull(view).getAutofillId();
            final ViewParent parent = view.getParent();
            if (parent instanceof View) {
                mNode.mParentAutofillId = ((View) parent).getAutofillId();
            }
        }

        ViewStructureImpl(@NonNull AutofillId parentId, int virtualId) {
            mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
            mNode.mAutofillId = new AutofillId(parentId, virtualId);
        }

        @Override
        public void setId(int id, String packageName, String typeName, String entryName) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setTransformation(Matrix matrix) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setElevation(float elevation) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAlpha(float alpha) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setVisibility(int visibility) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAssistBlocked(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setEnabled(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setClickable(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setLongClickable(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setContextClickable(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setFocusable(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setFocused(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAccessibilityFocused(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setCheckable(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setChecked(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setSelected(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setActivated(boolean state) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setOpaque(boolean opaque) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setClassName(String className) {
            // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
            mNode.mClassName = className;
        }

        @Override
        public void setContentDescription(CharSequence contentDescription) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setText(CharSequence text) {
            // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
            mNode.mText = text;
        }

        @Override
        public void setText(CharSequence text, int selectionStart, int selectionEnd) {
            // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
            mNode.mText = text;
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setTextStyle(float size, int fgColor, int bgColor, int style) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setTextLines(int[] charOffsets, int[] baselines) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setHint(CharSequence hint) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public CharSequence getText() {
            // TODO(b/111276913): temporarily getting directly; should be done on superclass instead
            return mNode.mText;
        }

        @Override
        public int getTextSelectionStart() {
            // TODO(b/111276913): implement or move to superclass
            return 0;
        }

        @Override
        public int getTextSelectionEnd() {
            // TODO(b/111276913): implement or move to superclass
            return 0;
        }

        @Override
        public CharSequence getHint() {
            // TODO(b/111276913): implement or move to superclass
            return null;
        }

        @Override
        public Bundle getExtras() {
            // TODO(b/111276913): implement or move to superclass
            return null;
        }

        @Override
        public boolean hasExtras() {
            // TODO(b/111276913): implement or move to superclass
            return false;
        }

        @Override
        public void setChildCount(int num) {
            Log.w(TAG, "setChildCount() is not supported");
        }

        @Override
        public int addChildCount(int num) {
            Log.w(TAG, "addChildCount() is not supported");
            return 0;
        }

        @Override
        public int getChildCount() {
            Log.w(TAG, "getChildCount() is not supported");
            return 0;
        }

        @Override
        public ViewStructure newChild(int index) {
            Log.w(TAG, "newChild() is not supported");
            return null;
        }

        @Override
        public ViewStructure asyncNewChild(int index) {
            Log.w(TAG, "asyncNewChild() is not supported");
            return null;
        }

        @Override
        public AutofillId getAutofillId() {
            // TODO(b/111276913): temporarily getting directly; should be done on superclass instead
            return mNode.mAutofillId;
        }

        @Override
        public void setAutofillId(AutofillId id) {
            // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
            mNode.mAutofillId = id;
        }

        @Override
        public void setAutofillId(AutofillId parentId, int virtualId) {
            // TODO(b/111276913): temporarily setting directly; should be done on superclass instead
            mNode.mAutofillId = new AutofillId(parentId, virtualId);
        }

        @Override
        public void setAutofillType(int type) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAutofillHints(String[] hint) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAutofillValue(AutofillValue value) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setAutofillOptions(CharSequence[] options) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setInputType(int inputType) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void setDataIsSensitive(boolean sensitive) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public void asyncCommit() {
            Log.w(TAG, "asyncCommit() is not supported");
        }

        @Override
        public Rect getTempRect() {
            // TODO(b/111276913): implement or move to superclass
            return null;
        }

        @Override
        public void setWebDomain(String domain) {
            Log.w(TAG, "setWebDomain() is not supported");
        }

        @Override
        public void setLocaleList(LocaleList localeList) {
            // TODO(b/111276913): implement or move to superclass
        }

        @Override
        public Builder newHtmlInfoBuilder(String tagName) {
            Log.w(TAG, "newHtmlInfoBuilder() is not supported");
            return null;
        }

        @Override
        public void setHtmlInfo(HtmlInfo htmlInfo) {
            Log.w(TAG, "setHtmlInfo() is not supported");
        }
    }
}
