package com.unibuy.smartdevice.ui;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.unibuy.smartdevice.AppCompatActivityAbstract;
import com.unibuy.smartdevice.AppEntry;
import com.unibuy.smartdevice.devices.MaintenanceMode;
import com.unibuy.smartdevice.tools.HandlerMain;
import com.unibuy.smartdevice.tools.ToastHandlerMain;

/**
 * 維修模式畫面（下位機串口已釋放）。移植自 StarApp-LockBoard。
 *
 * 進入此畫面時，本 app 已停止佔用下位機串口(主櫃 XinYuan)，
 * 現場人員可開啟原廠「下位機軟體」(興元)正常讀取/設定下位機。
 * 按「退出維修模式並恢復連線」→ 清除旗標並重啟 app，重新接管下位機。
 */
public class MaintenanceSerialActivity extends AppCompatActivityAbstract {

    @Override
    protected Context setCtx() {
        return this;
    }

    @Override
    protected Class<?> setCls() {
        return getClass();
    }

    @Override
    protected HandlerMain setHandlerMain() {
        return new ToastHandlerMain(getCtx(), getLogs());
    }

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

        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN);

        setContentView(buildLayout());
    }

    private View buildLayout() {
        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setGravity(Gravity.CENTER);
        root.setBackgroundColor(Color.parseColor("#005DAD"));
        int pad = dp(40);
        root.setPadding(pad, pad, pad, pad);

        TextView title = new TextView(this);
        title.setText("維修模式");
        title.setTextColor(Color.WHITE);
        title.setTextSize(40);
        title.setGravity(Gravity.CENTER);
        root.addView(title);

        TextView desc = new TextView(this);
        desc.setText("下位機串口已釋放\n\n按「進到下位機設置」開啟原廠下位機軟體進行設置\n設置完成回到本畫面，按「退出設置模式並恢復連線」");
        desc.setTextColor(Color.WHITE);
        desc.setTextSize(20);
        desc.setGravity(Gravity.CENTER);
        desc.setLineSpacing(dp(6), 1f);
        LinearLayout.LayoutParams descLp = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        descLp.topMargin = dp(24);
        root.addView(desc, descLp);

        // 進到下位機維護：串口已釋放，直接開啟原廠下位機(興元)軟體。
        Button toSlave = new Button(this);
        toSlave.setText("進到下位機設置");
        toSlave.setTextSize(22);
        toSlave.setAllCaps(false);
        toSlave.setTextColor(Color.parseColor("#005DAD"));
        toSlave.setBackgroundColor(Color.WHITE);
        LinearLayout.LayoutParams toSlaveLp = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        toSlaveLp.topMargin = dp(48);
        toSlave.setPadding(dp(32), dp(20), dp(32), dp(20));
        toSlave.setOnClickListener(v -> launchSlaveMachineApp());
        root.addView(toSlave, toSlaveLp);

        Button exit = new Button(this);
        exit.setText("退出設置模式並恢復連線");
        exit.setTextSize(22);
        exit.setAllCaps(false);
        exit.setTextColor(Color.WHITE);
        exit.setBackgroundColor(Color.parseColor("#555555")); // 深灰，與白底「進到下位機維護」區別
        LinearLayout.LayoutParams exitLp = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        exitLp.topMargin = dp(48);
        exit.setPadding(dp(32), dp(20), dp(32), dp(20));
        exit.setOnClickListener(v -> exitMaintenance());
        root.addView(exit, exitLp);

        return root;
    }

    /**
     * 進到下位機維護：開啟原廠下位機(興元 com.xyshj.machine)軟體。
     * 維修模式下串口已釋放，故不需 killProcess；本畫面留在背景，維護完返回即回到維修畫面，
     * 再按「退出維修模式並恢復連線」即可。
     */
    private void launchSlaveMachineApp() {
        try {
            getPackageManager().getPackageInfo("com.xyshj.machine", 0);
            Intent it = new Intent("android.intent.action.xinyuan.setting");
            it.putExtra("showLoginDialog", true);
            startActivity(it);
        } catch (PackageManager.NameNotFoundException e) {
            Toast.makeText(this, "請先安裝興元管理程式", Toast.LENGTH_SHORT).show();
        }
    }

    private void exitMaintenance() {
        getLogs().info("[維修模式] 退出維修模式，恢復下位機連線並重啟 app");
        // 清除持久化旗標 → 下次 MyApp.onCreate 會正常開啟下位機串口
        MaintenanceMode.setSerialReleased(getApplicationContext(), false);

        // 重啟 app：清空 Task 後啟動首頁，再結束本行程；重新啟動時即重新接管下位機串口。
        new Handler(Looper.getMainLooper()).post(() -> {
            Intent intent = new Intent(getApplicationContext(), AppEntry.initialActivity());
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            finishAffinity();
            android.os.Process.killProcess(android.os.Process.myPid());
        });
    }

    @Override
    public void onBackPressed() {
        // 維修畫面封鎖返回鍵，避免誤觸離開
    }

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