package ir.gemacc.admin;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MainActivity extends Activity {
    private static final int SMS_PERMISSION_REQUEST = 710;
    private final int background = Color.rgb(8, 17, 31);
    private final int card = Color.rgb(16, 29, 49);
    private final int text = Color.WHITE;
    private final int muted = Color.rgb(148, 163, 184);
    private final int green = Color.rgb(34, 197, 94);
    private final int orange = Color.rgb(245, 158, 11);
    private final int red = Color.rgb(239, 68, 68);
    private final Handler handler = new Handler(Looper.getMainLooper());

    private TextView permissionValue;
    private TextView connectionValue;
    private TextView queueValue;
    private TextView lastReceivedValue;
    private TextView lastSyncValue;
    private TextView lastScanValue;
    private TextView serverResultValue;
    private TextView errorValue;
    private Button permissionButton;

    private final Runnable refreshTask = new Runnable() {
        @Override public void run() {
            refreshStatus();
            handler.postDelayed(this, 2500L);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.setStatusBarColor(background);
        window.setNavigationBarColor(background);
        if (Build.VERSION.SDK_INT >= 23) window.getDecorView().setSystemUiVisibility(0);
        setContentView(buildUi());
        SmsUploader.initialize(getApplicationContext());
        if (!hasSmsPermissions()) requestSmsPermissions();
        refreshStatus();
    }

    @Override protected void onResume() {
        super.onResume();
        handler.removeCallbacks(refreshTask);
        handler.post(refreshTask);
        SmsUploader.scheduleImmediate(getApplicationContext());
    }

    @Override protected void onPause() {
        super.onPause();
        handler.removeCallbacks(refreshTask);
    }

    private View buildUi() {
        ScrollView scroll = new ScrollView(this);
        scroll.setFillViewport(true);
        scroll.setBackgroundColor(background);
        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setPadding(dp(18), dp(24), dp(18), dp(28));
        root.setGravity(Gravity.RIGHT);
        scroll.addView(root, new ScrollView.LayoutParams(-1, -2));

        TextView title = label("📩 تأیید پیامکی GEM ACC", 24, text, Typeface.BOLD);
        root.addView(title, fullWrap());
        TextView subtitle = label("اپ اختصاصی دریافت پیامک‌های واریزی و تأیید خودکار سفارش‌های ربات", 14, muted, Typeface.NORMAL);
        LinearLayout.LayoutParams subtitleParams = fullWrap();
        subtitleParams.setMargins(0, dp(7), 0, dp(18));
        root.addView(subtitle, subtitleParams);

        LinearLayout live = card();
        TextView liveTitle = label("وضعیت لحظه‌ای", 17, text, Typeface.BOLD);
        live.addView(liveTitle, fullWrap());
        permissionValue = statusRow(live, "دسترسی پیامک");
        connectionValue = statusRow(live, "اتصال سرور");
        queueValue = statusRow(live, "پیامک‌های در صف");
        serverResultValue = statusRow(live, "آخرین نتیجه سرور");
        root.addView(live, cardParams());

        LinearLayout activity = card();
        activity.addView(label("گزارش همگام‌سازی", 17, text, Typeface.BOLD), fullWrap());
        lastReceivedValue = statusRow(activity, "آخرین پیامک واریزی");
        lastSyncValue = statusRow(activity, "آخرین ارسال موفق");
        lastScanValue = statusRow(activity, "آخرین بررسی صندوق پیامک");
        errorValue = statusRow(activity, "آخرین خطا");
        root.addView(activity, cardParams());

        permissionButton = actionButton("فعال‌سازی دسترسی پیامک", green);
        permissionButton.setOnClickListener(v -> requestSmsPermissions());
        root.addView(permissionButton, buttonParams());

        Button syncNow = actionButton("🔄 همگام‌سازی فوری", green);
        syncNow.setOnClickListener(v -> {
            syncNow.setEnabled(false);
            syncNow.setText("در حال همگام‌سازی...");
            new Thread(() -> {
                boolean ok = SmsUploader.processQueueBlocking(getApplicationContext());
                runOnUiThread(() -> {
                    syncNow.setEnabled(true);
                    syncNow.setText("🔄 همگام‌سازی فوری");
                    refreshStatus();
                    toast(ok ? "همگام‌سازی انجام شد" : "پیامک‌های ناموفق در صف امن باقی ماندند");
                });
            }).start();
        });
        root.addView(syncNow, buttonParams());

        Button scan = actionButton("🔎 بررسی پیامک‌های ۷۲ ساعت اخیر", Color.rgb(37, 99, 235));
        scan.setOnClickListener(v -> {
            if (!hasSmsPermissions()) { requestSmsPermissions(); return; }
            scan.setEnabled(false);
            scan.setText("در حال بررسی...");
            SmsUploader.scanRecentSmsAsync(getApplicationContext(), 72, (scanned, queued, sent) -> runOnUiThread(() -> {
                scan.setEnabled(true);
                scan.setText("🔎 بررسی پیامک‌های ۷۲ ساعت اخیر");
                refreshStatus();
                toast("بررسی شد: " + scanned + " پیامک | جدید: " + queued + " | ارسال: " + sent);
            }));
        });
        root.addView(scan, buttonParams());

        Button test = actionButton("🌐 تست اتصال امن به ربات", Color.rgb(14, 116, 144));
        test.setOnClickListener(v -> {
            test.setEnabled(false);
            test.setText("در حال تست اتصال...");
            SmsUploader.testServerAsync(getApplicationContext(), (ok, message) -> runOnUiThread(() -> {
                test.setEnabled(true);
                test.setText("🌐 تست اتصال امن به ربات");
                toast(message);
                refreshStatus();
            }));
        });
        root.addView(test, buttonParams());

        Button battery = actionButton("🔋 تنظیم اجرای بدون محدودیت باتری", Color.rgb(71, 85, 105));
        battery.setOnClickListener(v -> openBatterySettings());
        root.addView(battery, buttonParams());

        LinearLayout note = card();
        note.addView(label("نحوه کار", 16, text, Typeface.BOLD), fullWrap());
        note.addView(label(
                "• به‌محض رسیدن پیامک واریزی، اپ آن را در حافظه امن صف می‌کند.\n" +
                "• اگر اینترنت برقرار باشد، پیامک فوراً برای ربات ارسال می‌شود.\n" +
                "• اگر اینترنت قطع باشد یا سرور موقتاً پاسخ ندهد، پیامک حذف نمی‌شود و تا ارسال موفق دوباره تلاش می‌شود.\n" +
                "• هر ۱۵ دقیقه صندوق پیامک نیز بررسی می‌شود تا پیامکی از قلم نیفتد.\n" +
                "• فقط پیامک‌های واریزی پردازش می‌شوند و شماره‌های بلند کارت و حساب در سرور ماسک می‌شوند.",
                13, muted, Typeface.NORMAL), fullWrap());
        root.addView(note, cardParams());

        TextView version = label("نسخه " + BuildConfig.VERSION_NAME + " | سرور: " + SmsUploader.configuredHost(), 12, muted, Typeface.NORMAL);
        version.setGravity(Gravity.CENTER);
        LinearLayout.LayoutParams versionParams = fullWrap();
        versionParams.setMargins(0, dp(6), 0, 0);
        root.addView(version, versionParams);
        return scroll;
    }

    private TextView statusRow(LinearLayout parent, String title) {
        LinearLayout row = new LinearLayout(this);
        row.setOrientation(LinearLayout.HORIZONTAL);
        row.setGravity(Gravity.CENTER_VERTICAL);
        row.setPadding(0, dp(12), 0, dp(3));
        TextView value = label("—", 13, muted, Typeface.NORMAL);
        value.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
        TextView key = label(title, 14, text, Typeface.BOLD);
        key.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
        row.addView(value, new LinearLayout.LayoutParams(0, -2, 1f));
        row.addView(key, new LinearLayout.LayoutParams(0, -2, 1f));
        parent.addView(row, fullWrap());
        return value;
    }

    private void refreshStatus() {
        if (permissionValue == null) return;
        boolean permissions = hasSmsPermissions();
        setStatus(permissionValue, permissions ? "✅ فعال" : "❌ غیرفعال", permissions ? green : red);
        permissionButton.setVisibility(permissions ? View.GONE : View.VISIBLE);

        boolean configured = SmsUploader.isConfigured();
        SmsUploader.Status status = SmsUploader.status(getApplicationContext());
        boolean online = status.lastHeartbeatAt > 0 && System.currentTimeMillis() - status.lastHeartbeatAt < 20L * 60L * 1000L;
        if (!configured) setStatus(connectionValue, "❌ تنظیم نشده", red);
        else if (online) setStatus(connectionValue, "✅ آنلاین | " + formatTime(status.lastHeartbeatAt), green);
        else setStatus(connectionValue, "در انتظار ارتباط با سرور", orange);

        setStatus(queueValue, status.queueCount == 0 ? "✅ خالی" : status.queueCount + " پیامک", status.queueCount == 0 ? green : orange);
        setStatus(lastReceivedValue, formatTime(status.lastReceivedAt) + safeSender(status.lastSender), status.lastReceivedAt > 0 ? text : muted);
        setStatus(lastSyncValue, formatTime(status.lastSuccessAt) + (status.totalSent > 0 ? " | مجموع " + status.totalSent : ""), status.lastSuccessAt > 0 ? green : muted);
        setStatus(lastScanValue, formatTime(status.lastScanAt), status.lastScanAt > 0 ? text : muted);
        setStatus(serverResultValue, status.lastServerStatus.length() == 0 ? "—" : translateStatus(status.lastServerStatus), status.lastServerStatus.length() == 0 ? muted : green);
        setStatus(errorValue, status.lastError.length() == 0 ? "بدون خطا" : status.lastError, status.lastError.length() == 0 ? green : red);
    }

    private String translateStatus(String status) {
        if ("approved".equals(status)) return "✅ سفارش تأیید و تحویل شد";
        if ("queued".equals(status)) return "✅ پرداخت تأیید؛ در صف تحویل";
        if ("already_delivered".equals(status)) return "✅ قبلاً تحویل شده";
        if ("no_match".equals(status)) return "پیامک ثبت شد؛ سفارش متناظر پیدا نشد";
        if ("ambiguous".equals(status)) return "چند سفارش هم‌مبلغ؛ نیازمند بررسی";
        if ("ignored".equals(status)) return "پیامک غیرمرتبط نادیده گرفته شد";
        return status;
    }

    private String safeSender(String sender) {
        return sender == null || sender.trim().length() == 0 ? "" : " | " + sender;
    }

    private String formatTime(long millis) {
        if (millis <= 0) return "هنوز ثبت نشده";
        return new SimpleDateFormat("yyyy/MM/dd  HH:mm:ss", Locale.US).format(new Date(millis));
    }

    private void setStatus(TextView view, String value, int color) {
        view.setText(value);
        view.setTextColor(color);
    }

    private boolean hasSmsPermissions() {
        return Build.VERSION.SDK_INT < 23 ||
                (checkSelfPermission(Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED &&
                 checkSelfPermission(Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED);
    }

    private void requestSmsPermissions() {
        if (Build.VERSION.SDK_INT < 23) return;
        requestPermissions(new String[]{Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS}, SMS_PERMISSION_REQUEST);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == SMS_PERMISSION_REQUEST) {
            if (hasSmsPermissions()) {
                SmsUploader.initialize(getApplicationContext());
                toast("دسترسی پیامک فعال شد");
            } else {
                toast("بدون دسترسی پیامک، تأیید خودکار انجام نمی‌شود");
            }
            refreshStatus();
        }
    }

    private void openBatterySettings() {
        try {
            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
            toast("در بخش Battery، گزینه Unrestricted یا بدون محدودیت را انتخاب کنید");
        } catch (Exception e) {
            startActivity(new Intent(Settings.ACTION_SETTINGS));
        }
    }

    private LinearLayout card() {
        LinearLayout box = new LinearLayout(this);
        box.setOrientation(LinearLayout.VERTICAL);
        box.setPadding(dp(16), dp(15), dp(16), dp(15));
        GradientDrawable bg = new GradientDrawable();
        bg.setColor(card);
        bg.setCornerRadius(dp(16));
        bg.setStroke(dp(1), Color.rgb(30, 51, 78));
        box.setBackground(bg);
        return box;
    }

    private Button actionButton(String value, int color) {
        Button button = new Button(this);
        button.setText(value);
        button.setTextColor(Color.WHITE);
        button.setTextSize(14);
        button.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
        button.setAllCaps(false);
        button.setGravity(Gravity.CENTER);
        GradientDrawable bg = new GradientDrawable();
        bg.setColor(color);
        bg.setCornerRadius(dp(14));
        button.setBackground(bg);
        return button;
    }

    private TextView label(String value, int size, int color, int style) {
        TextView view = new TextView(this);
        view.setText(value);
        view.setTextSize(size);
        view.setTextColor(color);
        view.setTypeface(Typeface.DEFAULT, style);
        view.setGravity(Gravity.RIGHT);
        view.setTextDirection(View.TEXT_DIRECTION_RTL);
        view.setLineSpacing(0, 1.15f);
        return view;
    }

    private LinearLayout.LayoutParams fullWrap() {
        return new LinearLayout.LayoutParams(-1, -2);
    }

    private LinearLayout.LayoutParams cardParams() {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2);
        params.setMargins(0, 0, 0, dp(12));
        return params;
    }

    private LinearLayout.LayoutParams buttonParams() {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, dp(54));
        params.setMargins(0, 0, 0, dp(10));
        return params;
    }

    private void toast(String value) {
        Toast.makeText(this, value, Toast.LENGTH_LONG).show();
    }

    private int dp(int value) {
        return Math.round(value * getResources().getDisplayMetrics().density);
    }
}
