package com.qsjnic.demo.vehicle;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

import com.qsjnic.mcu.contract.LineDetectInfo;
import com.qsjnic.mcu.contract.McuVersion;
import com.qsjnic.mcu.contract.VehicleSnapshot;
import com.qsjnic.mcu.sdk.McuClient;
import com.qsjnic.mcu.sdk.McuKeyClient;
import com.qsjnic.mcu.sdk.KeyListener;
import com.qsjnic.mcu.sdk.VehicleListener;

/**
 * Vehicle Demo — clean data panel + control grid.
 */
public class MainActivity extends Activity {

    private static final String TAG = "VehicleDemo";

    private final Handler ui = new Handler(Looper.getMainLooper());

    // Data panel fields
    private TextView tvHwVer, tvSwVer, tvBootVer;
    private TextView tvVoltage, tvAcc, tvIg, tvIll, tvReverse;
    private TextView tvSysStatus, tvBacklight, tvTime;
    private TextView tvKeyDomain;

    // Control buttons
    private Button btnMuteOn, btnMuteOff, btnBl50, btnBl100, btnRefresh;
    private Button btnKeyMode, btnKeyMute, btnKeyWorkMode, btnKeyCall;
    private Button btnKeyVoice, btnKeyHome, btnKeyOk;
    private Button btnKeyChUp, btnKeyChDown, btnKeyVolUp, btnKeyVolDown;

    private final VehicleListener listener = new VehicleListener() {
        @Override public void onLineDetectChanged(LineDetectInfo info) {
            ui.post(() -> updateLine(info));
        }
        @Override public void onVoltage(int mv) {
            ui.post(() -> tvVoltage.setText(mv >= 0 ? String.format("%.1f V", mv / 1000.0) : "--"));
        }
        @Override public void onSysStatus(int firstPwrOn) {
            ui.post(() -> tvSysStatus.setText(firstPwrOn >= 0 ? (firstPwrOn == 1 ? "YES" : "NO") : "--"));
        }
        @Override public void onBacklightChanged(int duty) {
            ui.post(() -> tvBacklight.setText(duty >= 0 ? duty + "%" : "--"));
        }
        @Override public void onMcuVersion(McuVersion v) {
            ui.post(() -> updateVersion(v));
        }
        @Override public void onTimeChanged(long epochMillis, boolean isSet) {
            ui.post(() -> tvTime.setText(isSet ? String.valueOf(epochMillis) : "--"));
        }
    };

    private final KeyListener keyListener = new KeyListener() {
        @Override public void onKeyEvent(int keyValue, int keyStatus) {
            ui.post(() -> tvKeyDomain.setText(String.format("value=0x%02X status=0x%02X", keyValue, keyStatus)));
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ScrollView scroll = new ScrollView(this);
        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setPadding(32, 32, 32, 32);
        root.setBackgroundColor(Color.parseColor("#F5F5F5"));

        // ===== Title =====
        TextView title = new TextView(this);
        title.setText("Vehicle Monitor");
        title.setTextSize(24f);
        title.setTypeface(null, Typeface.BOLD);
        title.setTextColor(Color.parseColor("#333333"));
        title.setPadding(0, 0, 0, 16);
        root.addView(title);

        // ===== MCU Version Card =====
        root.addView(sectionTitle("MCU Version"));
        LinearLayout verCard = card(root);
        tvHwVer  = row(verCard, "HW:", "--");
        tvSwVer  = row(verCard, "SW:", "--");
        tvBootVer = row(verCard, "Boot:", "--");

        // ===== Line Detect Card =====
        root.addView(sectionTitle("Line Detection"));
        LinearLayout lineCard = card(root);
        tvIg      = row(lineCard, "IG (Ignition):", "--");
        tvAcc     = row(lineCard, "ACC:", "--");
        tvIll     = row(lineCard, "Illumination:", "--");
        tvReverse = row(lineCard, "Reverse:", "--");

        // ===== System Status Card =====
        root.addView(sectionTitle("System Status"));
        LinearLayout sysCard = card(root);
        tvVoltage   = row(sysCard, "Voltage:", "--");
        tvSysStatus = row(sysCard, "First Power On:", "--");
        tvBacklight = row(sysCard, "Backlight:", "--");
        tvTime      = row(sysCard, "Time:", "--");

        // ===== Key Domain Card =====
        root.addView(sectionTitle("Key Domain"));
        LinearLayout keyCard = card(root);
        tvKeyDomain = row(keyCard, "Last Key:", "--");

        LinearLayout keyRow1 = buttonRow(keyCard);
        btnKeyMode     = btn(keyRow1, "MODE", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_MODE, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyMute     = btn(keyRow1, "MUTE", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_MUTE, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyWorkMode = btn(keyRow1, "WORKMODE", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_WORKMODE, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyCall     = btn(keyRow1, "CALL", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_CALL, McuKeyClient.KEY_STATUS_SHORT_PRESS));

        LinearLayout keyRow2 = buttonRow(keyCard);
        btnKeyVoice  = btn(keyRow2, "VOICE", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_VOICE_ASSISTANT, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyHome   = btn(keyRow2, "HOME", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_HOME, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyOk     = btn(keyRow2, "OK", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_OK, McuKeyClient.KEY_STATUS_SHORT_PRESS));

        LinearLayout keyRow3 = buttonRow(keyCard);
        btnKeyChUp    = btn(keyRow3, "上一曲", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_CHANNEL_UP, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyChDown  = btn(keyRow3, "下一曲", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_CHANNEL_DOWN, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyVolUp   = btn(keyRow3, "音量+", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_VOLUME_UP, McuKeyClient.KEY_STATUS_SHORT_PRESS));
        btnKeyVolDown = btn(keyRow3, "音量-", v -> McuClient.getInstance().key().sendKeyEvent(McuKeyClient.KEY_VALUE_VOLUME_DOWN, McuKeyClient.KEY_STATUS_SHORT_PRESS));

        // ===== Control Panel =====
        root.addView(sectionTitle("Control Commands"));
        LinearLayout ctrlCard = card(root);

        // Row 1: Mute
        LinearLayout row1 = buttonRow(ctrlCard);
        btnMuteOn  = btn(row1, "Mute ON",  v -> McuClient.getInstance().vehicle().setMute(true));
        btnMuteOff = btn(row1, "Mute OFF", v -> McuClient.getInstance().vehicle().setMute(false));

        // Row 2: Backlight
        LinearLayout row2 = buttonRow(ctrlCard);
        btnBl50  = btn(row2, "BL 50%", v -> McuClient.getInstance().vehicle().setBacklight(50, 50));
        btnBl100 = btn(row2, "BL 100%", v -> McuClient.getInstance().vehicle().setBacklight(100, 100));

        // Row 3: Refresh
        LinearLayout row3 = buttonRow(ctrlCard);
        btnRefresh = btn(row3, "Refresh Init", v -> McuClient.getInstance().vehicle().requestInitInfo());

        scroll.addView(root);
        setContentView(scroll);

        McuClient.getInstance().init(getApplicationContext());
        McuClient.getInstance().vehicle().addListener(listener);
        McuClient.getInstance().key().addListener(keyListener);
    }

    // ---------- UI helpers ----------

    private TextView sectionTitle(String text) {
        TextView t = new TextView(this);
        t.setText(text);
        t.setTextSize(14f);
        t.setTypeface(null, Typeface.BOLD);
        t.setTextColor(Color.parseColor("#666666"));
        t.setPadding(8, 24, 0, 8);
        return t;
    }

    private LinearLayout card(LinearLayout parent) {
        LinearLayout card = new LinearLayout(this);
        card.setOrientation(LinearLayout.VERTICAL);
        card.setPadding(24, 24, 24, 24);
        card.setBackgroundColor(Color.WHITE);
        GradientDrawable bg = new GradientDrawable();
        bg.setColor(Color.WHITE);
        bg.setCornerRadius(16f);
        card.setBackground(bg);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lp.setMargins(0, 0, 0, 16);
        card.setLayoutParams(lp);
        parent.addView(card);
        return card;
    }

    private TextView row(LinearLayout parent, String label, String value) {
        LinearLayout row = new LinearLayout(this);
        row.setOrientation(LinearLayout.HORIZONTAL);
        row.setPadding(0, 8, 0, 8);

        TextView tvLabel = new TextView(this);
        tvLabel.setText(label);
        tvLabel.setTextSize(14f);
        tvLabel.setTextColor(Color.parseColor("#888888"));
        tvLabel.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));
        row.addView(tvLabel);

        TextView tvValue = new TextView(this);
        tvValue.setText(value);
        tvValue.setTextSize(16f);
        tvValue.setTypeface(null, Typeface.BOLD);
        tvValue.setTextColor(Color.parseColor("#333333"));
        tvValue.setGravity(Gravity.END);
        row.addView(tvValue);

        parent.addView(row);
        return tvValue;
    }

    private LinearLayout buttonRow(LinearLayout parent) {
        LinearLayout row = new LinearLayout(this);
        row.setOrientation(LinearLayout.HORIZONTAL);
        row.setPadding(0, 8, 0, 8);
        parent.addView(row);
        return row;
    }

    private Button btn(LinearLayout parent, String label, View.OnClickListener l) {
        Button b = new Button(this);
        b.setText(label);
        b.setOnClickListener(l);
        b.setAllCaps(false);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
        lp.setMargins(8, 0, 8, 0);
        b.setLayoutParams(lp);
        parent.addView(b);
        return b;
    }

    // ---------- Data update ----------

    private void updateVersion(McuVersion v) {
        if (v == null) return;
        tvHwVer.setText(v.hwVersion != null ? v.hwVersion : "--");
        tvSwVer.setText(v.swVersion != null ? v.swVersion : "--");
        tvBootVer.setText(v.bootVersion != null ? v.bootVersion : "--");
    }

    private void updateLine(LineDetectInfo info) {
        if (info == null) return;
        tvIg.setText(info.ig ? "ON" : "OFF");
        tvIg.setTextColor(info.ig ? Color.parseColor("#4CAF50") : Color.parseColor("#999999"));
        tvAcc.setText(info.acc ? "ON" : "OFF");
        tvAcc.setTextColor(info.acc ? Color.parseColor("#4CAF50") : Color.parseColor("#999999"));
        tvIll.setText(info.illumination ? "ON" : "OFF");
        tvIll.setTextColor(info.illumination ? Color.parseColor("#4CAF50") : Color.parseColor("#999999"));
        tvReverse.setText(info.reverse ? "ON" : "OFF");
        tvReverse.setTextColor(info.reverse ? Color.parseColor("#FF5722") : Color.parseColor("#999999"));
    }

    @Override
    protected void onDestroy() {
        McuClient.getInstance().vehicle().removeListener(listener);
        McuClient.getInstance().key().removeListener(keyListener);
        super.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!McuClient.getInstance().isReady()) {
            android.widget.Toast.makeText(this, "Service 未连接，5s后重试", android.widget.Toast.LENGTH_SHORT).show();
            new Handler(Looper.getMainLooper()).postDelayed(this::onResume, 5000);
        }
    }
}
