package com.parentalmonitor.child.activities;

import android.Manifest;
import android.content.*;
import android.content.pm.PackageManager;
import android.os.*;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.parentalmonitor.child.api.ApiClient;
import com.parentalmonitor.child.services.*;
import com.parentalmonitor.child.utils.*;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST = 100;
    private EditText pairCodeInput;
    private TextView statusText;
    private Button pairButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getResources().getIdentifier("activity_main", "layout", getPackageName()));

        pairCodeInput = findViewById(getResources().getIdentifier("pairCodeInput", "id", getPackageName()));
        statusText = findViewById(getResources().getIdentifier("statusText", "id", getPackageName()));
        pairButton = findViewById(getResources().getIdentifier("pairButton", "id", getPackageName()));

        pairButton.setOnClickListener(v -> pairDevice());
        requestPermissions();

        if (ApiClient.getInstance(this).getDeviceId() > 0) {
            statusText.setText("Device paired. Monitoring active.");
            startServices();
        }
    }

    private void pairDevice() {
        String code = pairCodeInput.getText().toString().trim();
        if (code.length() != 6) {
            Toast.makeText(this, "Enter 6-digit pair code", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            JSONObject data = new JSONObject();
            data.put("pair_code", code);
            data.put("device_name", Build.MODEL);
            data.put("device_model", Build.MANUFACTURER + " " + Build.MODEL);
            data.put("android_version", Build.VERSION.RELEASE);
            data.put("sdk_version", Build.VERSION.SDK_INT);

            ApiClient.getInstance(this).postAsync("/api/devices/pair", data, result -> {
                runOnUiThread(() -> {
                    if (result.optBoolean("success")) {
                        try {
                            JSONObject deviceData = result.getJSONObject("data");
                            ApiClient.getInstance(this).setDeviceId(deviceData.getInt("device_id"));
                            ApiClient.getInstance(this).setToken(
                                deviceData.optString("access_token", ""),
                                deviceData.optString("refresh_token", ""));
                            statusText.setText("Paired! Waiting for approval...");
                            startServices();
                        } catch (Exception e) {
                            statusText.setText("Error: " + e.getMessage());
                        }
                    } else {
                        statusText.setText("Failed: " + result.optString("message"));
                    }
                });
            });
        } catch (Exception e) {
            statusText.setText("Error: " + e.getMessage());
        }
    }

    private void startServices() {
        Intent syncIntent = new Intent(this, SyncService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(syncIntent);
        } else {
            startService(syncIntent);
        }
        startService(new Intent(this, AppMonitorService.class));
        startService(new Intent(this, ScreenTimeService.class));
        startService(new Intent(this, LocationService.class));

        NetworkMonitor nm = new NetworkMonitor(this);
        nm.register();

        KeywordDetector.getInstance().loadKeywords(this);
    }

    private void requestPermissions() {
        String[] perms = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.READ_CALL_LOG,
            Manifest.permission.READ_SMS,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.CAMERA,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.RECEIVE_SMS
        };
        ActivityCompat.requestPermissions(this, perms, PERMISSION_REQUEST);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_REQUEST) {
            int granted = 0;
            for (int r : grantResults) if (r == PackageManager.PERMISSION_GRANTED) granted++;
            statusText.setText("Permissions: " + granted + "/" + permissions.length + " granted");
        }
    }
}
