package com.BOBs.BBS;

import android.app.Activity;
import android.content.SharedPreferences;
import android.graphics.Rect;
import android.util.Log;

import androidx.core.util.Consumer;
import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter;
import androidx.window.layout.DisplayFeature;
import androidx.window.layout.FoldingFeature;
import androidx.window.layout.WindowInfoTracker;
import androidx.window.layout.WindowLayoutInfo;

import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.ActivityObject;
import anywheresoftware.b4a.BA.DependsOn;
import anywheresoftware.b4a.BA.Permissions;
import anywheresoftware.b4a.BA.ShortName;
import anywheresoftware.b4a.BA.Version;

@Version(1.1f)
@ShortName("FoldBridge")
@BA.DependsOn(values = {"window-1.4.0", "window-java-1.4.0"})
public class FoldBridge {
    private WindowInfoTrackerCallbackAdapter adapter;
    private Consumer<WindowLayoutInfo> layoutListener;

    /**
     * Starts listening to fold state and saves data into SharedPreferences.
     */
    public void Start(final Activity activity) {
        WindowInfoTracker tracker = WindowInfoTracker.getOrCreate(activity);
        adapter = new WindowInfoTrackerCallbackAdapter(tracker);
        Executor executor = Executors.newSingleThreadExecutor();

        layoutListener = new Consumer<WindowLayoutInfo>() {
            @Override
            public void accept(WindowLayoutInfo info) {
                SharedPreferences prefs = activity.getSharedPreferences("foldinfo", Activity.MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();

                boolean found = false;
                List<DisplayFeature> features = info.getDisplayFeatures();
                for (DisplayFeature df : features) {
                    if (df instanceof FoldingFeature) {
                        FoldingFeature fold = (FoldingFeature) df;
                        editor.putString("state", fold.getState().toString());
                        editor.putString("orientation", fold.getOrientation().toString());

                        Rect bounds = fold.getBounds();
                        int hinge = (fold.getOrientation() == FoldingFeature.Orientation.VERTICAL) ?
                                bounds.width() : bounds.height();
                        editor.putInt("hinge", hinge);

                        found = true;
                        break;
                    }
                }

                if (!found) {
                    editor.putString("state", "NONE");
                    editor.remove("orientation");
                    editor.putInt("hinge", 0);
                }

                editor.apply();
                Log.i("FoldBridge", "Fold info saved");
            }
        };

        adapter.addWindowLayoutInfoListener(activity, executor, layoutListener);
    }

    /**
     * Stops listening to fold state changes.
     */
    public void Stop() {
        if (adapter != null && layoutListener != null) {
            adapter.removeWindowLayoutInfoListener(layoutListener);
        }
    }
}
