package com.secureline.server;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Slog;

import java.util.function.Supplier;

final class SecureLineTamperDetector implements SensorEventListener {

    private static final String TAG = "SecureLineTamper";

    private final SensorManager mSensorManager;
    private final Sensor mAccelerometer;

    private final Supplier<Boolean> mEnabledSupplier;
    private final Supplier<Integer> mSensitivitySupplier;

    private final Runnable mTriggerLock;

    private long mLastTrigger = 0;

    private boolean mRunning;

    SecureLineTamperDetector(
            Context context,
            Supplier<Boolean> enabledSupplier,
            Supplier<Integer> sensitivitySupplier,
            Runnable triggerLock) {

        mSensorManager =
                (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

        mAccelerometer =
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        mEnabledSupplier = enabledSupplier;
        mSensitivitySupplier = sensitivitySupplier;

        mTriggerLock = triggerLock;
    }

    void start() {

        if (mRunning) return;

        if (mAccelerometer == null) {
            Slog.e(TAG, "Accelerometer missing");
            return;
        }

        mSensorManager.registerListener(
                this,
                mAccelerometer,
                SensorManager.SENSOR_DELAY_NORMAL
        );

        mRunning = true;

        Slog.i(TAG, "Tamper detector started");
    }

    void stop() {

        if (!mRunning) return;

        mSensorManager.unregisterListener(this);

        mRunning = false;

        Slog.i(TAG, "Tamper detector stopped");
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (!mEnabledSupplier.get())
            return;

        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        float magnitude =
            (float)Math.sqrt(x*x + y*y + z*z);

        float threshold =
            mSensitivitySupplier.get() ==
            SecureLinePolicy.TAMPER_SENSITIVITY_HIGH
                ? SecureLinePolicy.TAMPER_THRESHOLD_HIGH
                : SecureLinePolicy.TAMPER_THRESHOLD_NORMAL;

        if (magnitude > threshold) {

            long now =
                android.os.SystemClock.elapsedRealtime();

            if (now - mLastTrigger < 4000)
                return;

            mLastTrigger = now;

            Slog.w(TAG,
                "Tamper motion detected → locking");

            mTriggerLock.run();
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}
