package com.unibuy.smartdevice.ui.dialog;

import android.content.Context;

import com.blankj.utilcode.util.ToastUtils;
import com.unibuy.smartdevice.DialogAbstract;
import com.unibuy.smartdevice.MyApp;
import com.unibuy.smartdevice.R;
import com.unibuy.smartdevice.databinding.DialogProductDetailBinding;
import com.unibuy.smartdevice.exception.LogsEmptyException;
import com.unibuy.smartdevice.structure.SlotStructure;
import com.unibuy.smartdevice.tools.HandlerMain;
import com.unibuy.smartdevice.tools.ToastHandlerMain;
import com.unibuy.smartdevice.ui.FontendActivity;
import com.unibuy.smartdevice.ui.SaleFlowHandler;
import com.unibuy.smartdevice.ui.tools.ImageGlide;
import com.unibuy.v2.UnibuyHelper;

/**
 * 商品詳情對話框。
 * 點選商品後一律先彈出此頁，依雲端 B014 DevSet.ShoppingCar 決定按鈕：
 *  - 購物車開啟：顯示「數量調整 + 加入購物車 + 直接購買」。
 *  - 購物車關閉（一般版）：隱藏「數量調整 + 加入購物車」，只留「直接購買」（數量固定 1）。
 * 「直接購買」沿用既有單品直購流程（清空 buyList → BuyDialog 選付款）。
 */
public class DialogProductDetail extends DialogAbstract {

    private DialogProductDetailBinding binding;
    private final SlotStructure slot;
    // 建構子傳入的原始 Context（真正的 FontendActivity）。
    // 不可用 onCreate 的 getContext()，那是 AlertDialog 包裝過的 ContextThemeWrapper，
    // instanceof FontendActivity 會是 false，導致購物車頁/結帳入口取不到 SaleFlowHandler。
    private final Context hostContext;
    private int quantity = 1;

    public DialogProductDetail(Context context, HandlerMain srcHandlerMain, SlotStructure slot) {
        super(context, srcHandlerMain);
        this.hostContext = context;
        if (slot == null || slot.getProduct() == null) {
            this.slot = createMockSlot();
        } else {
            this.slot = slot;
        }
    }

    private SlotStructure createMockSlot() {
        com.unibuy.smartdevice.structure.ProductStructure mockProduct = new com.unibuy.smartdevice.structure.ProductStructure(
                "mock_001",
                "",
                "模擬商品名稱 (Mock)",
                30,
                30,
                30,
                10,
                "",
                "MOCK_CODE",
                "Mock Product Name",
                "模擬の商品"
        );
        mockProduct.setSpecI18nJson("{\"zh_TW\":\"此為模擬商品描述，用於當系統尚未寫入真實商品資料時，可供開發者與測試人員模擬查看詳細頁面的版面配置與樣式呈現。\\n支援換行與多種排版。\",\"en\":\"This is a mock product description used for simulating layout and styling before real data is populated.\"}");
        return new SlotStructure(1, 99, mockProduct, 5);
    }

    private boolean isMock() {
        return slot != null && slot.getProduct() != null && "mock_001".equals(slot.getProduct().getProductID());
    }

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

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

    @Override
    protected HandlerMain setHandlerMain() {
        return new ToastHandlerMain(getContext(), getLogs()) {
            @Override
            protected void execute(Context context, int commandCode, String message) {
                // 本對話框不需處理回呼指令
            }
        };
    }

    @Override
    protected void onCreate(Context context) {
        binding = DialogProductDetailBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // 商品圖片
        try {
            new ImageGlide(context).fileload(slot.getProduct().getProductImg(), binding.imageProduct);
        } catch (LogsEmptyException e) {
            getLogs().warning(e);
        }

        // 商品名稱（多語）、貨道、庫存
        binding.textProductName.setText(slot.getProduct().getLocalizedName(context));
        binding.slotNumber.setText(context.getString(R.string.slot_label) + slot.getSlot());
        binding.inventoryNumber.setText(context.getString(R.string.stock_label) + slot.getCount());

        // 商品規格／描述（多語，純文字含換行；後台空白則隱藏整塊）。
        // setText 原樣呈現換行與空格／縮排；版面已設 gravity=start，故縮排不會被置中打亂。
        String spec = slot.getProduct().getLocalizedSpec(context);
        if (spec == null || spec.trim().isEmpty()) {
            binding.textProductDescription.setVisibility(android.view.View.GONE);
        } else {
            binding.textProductDescription.setText(spec);
        }

        // 依購物車開關決定按鈕呈現
        boolean cartOn = MyApp.getInstance().getDevSet().isShoppingCar();
        if (!cartOn) {
            // 一般版：隱藏數量調整與加入購物車，只留直接購買，數量固定 1
            binding.layoutQuantityControl.setVisibility(android.view.View.GONE);
            binding.btnAddToCart.setVisibility(android.view.View.GONE);
            quantity = 1;
        }

        refreshQuantity();

        binding.ivCancel.setOnClickListener(v -> cancel());

        binding.buttonMinus.setOnClickListener(v -> {
            if (quantity > 1) {
                quantity--;
                refreshQuantity();
            }
        });

        binding.buttonPlus.setOnClickListener(v -> {
            // 上限：貨道庫存與購物車總量上限（3 件）
            if (quantity >= slot.getCount()) {
                ToastUtils.showShort(R.string.cart_out_of_stock);
                return;
            }
            if (quantity >= 3) {
                ToastUtils.showShort(R.string.cart_max_items);
                return;
            }
            quantity++;
            refreshQuantity();
        });

        // 加入購物車：以選定數量加入購物車後停留商品列表（CartViewModel 內建庫存／8 件上限防呆）
        binding.btnAddToCart.setOnClickListener(v -> {
            if (isMock()) {
                ToastUtils.showShort("此為模擬商品，無法加入購物車");
                cancel();
                return;
            }
            // 效期過期商品一律暫不販售
            if (slot.isExpired()) {
                ToastUtils.showShort(R.string.product_expired);
                cancel();
                return;
            }
            addSelectedQuantityToCart();
            ToastUtils.showShort(R.string.cart_added);
            cancel();
        });

        // 直接購買：
        //  - 購物車開啟：以選定數量加入購物車後，前往購物車列表頁（數量帶入，不直接結帳）。
        //  - 購物車關閉（一般版）：單品直購，清空 buyList 放入本商品後彈 BuyDialog 選付款。
        binding.btnBuyNow.setOnClickListener(v -> {
            if (isMock()) {
                ToastUtils.showShort("此為模擬商品，無法購買");
                cancel();
                return;
            }
            if (cartOn) {
                addSelectedQuantityToCart();
                // 先切到購物車品項頁（於詳情頁視窗後方），再關閉詳情頁顯示出來，
                // 避免「關閉對話框」與「fragment 切換」時序互相干擾導致沒跳頁。
                openCartList();
                cancel();
            } else {
                MyApp.getInstance().getBuyList().clear();
                // 依可賣貨道把數量拆成多筆 count=1，規避 VMC 出貨狀態機不支援單筆 quantity>1（會卡 40 秒看門狗）。
                MyApp.getInstance().getBuyList().addAll(
                        MyApp.getInstance().allocateBuyStructures(slot, quantity));
                cancel();
                requestBuy();
            }
        });
    }

    /** 以詳情頁選定數量加入購物車（逐件累加，數量確實帶入；受庫存／8 件上限限制）。 */
    private void addSelectedQuantityToCart() {
        for (int i = 0; i < quantity; i++) {
            UnibuyHelper.INSTANCE.getCartViewModel().addToCart(slot);
        }
    }

    /** 前往購物車列表頁（沿用各 flavor 的購物車入口）。 */
    private void openCartList() {
        if (hostContext instanceof FontendActivity) {
            SaleFlowHandler handler = ((FontendActivity) hostContext).getSaleFlowHandler();
            if (handler != null) {
                handler.onShoppingCartRequested();
            }
        }
    }

    private void refreshQuantity() {
        binding.textQuantity.setText(String.valueOf(quantity));
        int total = slot.getProduct().getRealPrice() * quantity;
        binding.textPrice.setText("$" + total);
    }

    /** 沿用各 flavor 的結帳入口（basic→BuyDialog）；非 FontendActivity 時直接開 BuyDialog。 */
    private void requestBuy() {
        if (hostContext instanceof FontendActivity) {
            SaleFlowHandler handler = ((FontendActivity) hostContext).getSaleFlowHandler();
            if (handler != null) {
                handler.onBuyRequested();
                return;
            }
        }
        new BuyDialog(hostContext, getSrcHandlerMain()).show();
    }

    /**
     * 商品詳情僅為瀏覽性質，非交易/出貨忙碌狀態。
     * 標記為非忙碌，閒置逾時時可自動關閉返回首頁，且不會擋掉遠端重啟（[Dialog Open]）。
     */
    @Override
    public boolean isBusyDialog() {
        return false;
    }
}
