package com.printer.demo.utils;


import android.util.Log;

import com.printer.demo.bean.LaoAlignedTable;
import com.printer.demo.bean.LaoAlignedTable.Align;


/**
 * 老挝文打印机测试套件
 */
public class LaoPrinterTestSuite {

    public interface PrinterInterface {
        void printText(String text);
    }

    public static void runAllTests(PrinterInterface printer) {
//        calibrateScale(printer);
//        runHeavyTest(printer);
//        testPrintLao(printer);    // 1. 最小间距测试
        testPrintLao80mm(printer);    // 1. 最小间距测试
        testPrintLaoInvoice(printer);    // 1. 最小间距测试
//        testSmallSpacing(printer);    // 1. 最小间距测试
//        testLargeSpacing(printer);    // 2. 最大间距测试
//        testExtremeWrapping(printer); // 3. 极端换行测试
//        testTwoColumnLayout(printer); // 4. 两列布局测试
    }

    public static void testPrintLao80mm(PrinterInterface printer) {
        // 80mm 打印机常用列宽分配
        int[] colWidths = {20, 6, 14};
        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable table = new LaoAlignedTable(colWidths, aligns);
        table.setColSpacing(2); // 关键：增加间距防止漂移

        // 表头
        table.addRow("ລາຍການ (Item)", "ຈຳນວນ", "ລາຄາ (Price)");
        table.addRow("--------------------", "------", "--------------");

        // 1. 简单测试：老挝啤酒
        table.addRow("ເບຍລາວ (Beer Lao)", "2", "30,000");

        // 2. 复杂音标测试：纯净水（含有多个上下标）
        // 'ນ້ຳດື່ມບໍລິສຸດ' 极其容易产生音标重影
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອ", "12", "60,000");

        // 3. 长文本换行测试：凉拌木瓜丝（特辣、大份）
        // 这个词很长，会触发 wrapByWidth
        table.addRow("ຕຳໝາກຫຸ່ງລວມມິດພິເສດເຜັດໆ", "1", "45,000");

        // 4. 数字与符号测试
        table.addRow("ເຂົ້າຜັດໝູກອບ + ໄຂ່ດາວ", "1", "35,000");

        // 5. 结尾测试
        table.addRow("--------------------", "------", "--------------");
        table.addRow("ທັງໝົດ (Total)", "", "170,000 LAK");

        printer.printText(table.render());
    }
//    public static void testPrintLao80mm(PrinterInterface printer) {
//        // 80mm 打印机物理宽度通常是 48
//        // 调大第三列，减小前两列。给第三列 24 的空间，这样 20 宽的文本就有 4 个格可以“对齐”
//        int[] colWidths = {20, 10, 10};
//
//        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
//        LaoAlignedTable table = new LaoAlignedTable(colWidths, aligns);
//
//        // 增加一个简单的数字行，作为参照物（数字在非等宽字体中通常宽度较统一）
//        table.addRow("ITEM-001", "10", "1,200,000");
//        table.addRow("ITEM-002ITEM-002ITEM-002ITEM-002", "10", "1,200,000");
//        table.addRow("Khao Phad Moo Grob Extra\\ນ້ຳດື່ມບໍລິສຸດຕາຫົວ", "1", "45,000");
//        table.addRow("ITEM-002ITEM-002ITEM-002ITEM-002", "ITEM-002ITEM-002ITEM-002ITEM-002", "1,200,000");
//        table.addRow("3000000", "3000000", "3000000");
//        table.addRow("ລາຍການລາຍການ", "ຈໍານວນເງິນຈໍານວນເງິນຈໍານວນເງິນຈໍານວນເງິນ", "3000000");
//        table.addRow("ITEM-002ITEM-002ITEM-002ITEM-003", "ITEM-002ITEM-002ITEM-002ITEM-002", "ITEM-002ITEM-002ITEM-002ITEM-002ITEM-0031,200,000");
//        table.addRow("ລາຍການລາຍການ", "1", "ຈໍານວນເງິນຈໍານວນເງິນ");
//        table.addRow("ລາຍການລາຍການ", "ຈໍານວນເງິນຈໍານວນເງິນ", "3000000");
//        table.addRow("້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ", "ຈໍານວນເງິນຈໍານວນເງິນ", "3000000");
//        table.addRow("ລາຍການລາຍການ", "ຈໍານວນເງິນຈໍານວນເງິນ", "້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື");
//        table.addRow("ລາຍການລາຍການ", "້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕຍ", "3000000");
//        table.addRow("້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ", "3000000", "500");
//        table.addRow("ລາຍການລາຍການ", "100", "3000000");
//
//
//        // Logcat 输出
//
//        printer.printText(table.render());
//
//
//    }


    public static void testPrintLaoInvoice(PrinterInterface printer) {
        // 设定总宽度（例如 32 或 40 字符，根据打印机纸张调整）
        int totalWidth = 40;

        // 1. 头部标题 - 直接打印 (手动居中或由打印机指令居中)
        printer.printText("      ໃບເກັບເງິນອາກອນ\n");
        printer.printText("        TAX INVOICE\n");
        printer.printText("   (ອາກອນມູນຄ່າເພີ່ມ / VAT)\n\n");

        // 2. 基础信息 - 直接打印
        StringBuilder info = new StringBuilder();
        info.append("ຜູ້ຂາຍ / Supplier : laowo\n");
        info.append("ເລກປະຈໍາຕົວຜູເສຍອາກອນ / TIN : 373363686900\n");
        info.append("ໂທ / Tel : 13900008888\n");
        info.append("ທີ່ຢູ່ / Address : \n");
        info.append("1001 Huaxia Road, Zhujiang New Town,\n");
        info.append("Tianhe District, Guangzhou, China\n\n");

        info.append("ຜູ້ຊື້ / Buyer : TIN22byte\n");
        info.append("ເລກປະຈໍາຕົວຜູເສຍອາກອນ / TIN :\n");
        info.append("ຮ້ານຂາຍເຄື່ອງດື່ມ ແລະ ອາຫານເຮັດໃຫ້ດີ ຮ້ານຂາຍເຄື່ອງດື່ມ ແລະ ອາຫານເຮັດໃຫ້ດີ   / TIN :\n");
        info.append("1234567890123456789012\n");
        info.append("ທີ່ຢູ່ / Address : NA\n");
        info.append("ວັນທີ / Date : 22 Dec 2025 19:02:44\n");
        printer.printText(info.toString());

        // 3. 商品明细 - 使用表格对齐 (假设总宽 32: 名称 16, 数量 6, 金额 10)

        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable detailTable = new LaoAlignedTable(new int[]{22, 6, 10}, aligns);

        detailTable.addDivider('-');

        printer.printText(detailTable.generate());

        // 4. 结算部分 - 使用表格对齐 (左侧标签宽，右侧金额宽)
        Align[] aligns2 = {Align.LEFT, Align.RIGHT};
        LaoAlignedTable totalTable = new LaoAlignedTable(new int[]{30, 10}, aligns2);

        totalTable.addRow("ລວມ / Subtotal", "100.00");
        totalTable.addRow("ສ່ວນຫຼຸດ / Discount", "0.00");
        totalTable.addRow("ຄ່າບໍລິການ / Service Charge", "0.00");
        totalTable.addRow("ອາກອນມູນຄ່າເພີ່ມ / VAT (10%)", "10.00");
        totalTable.addRow("ອາກອນຊົມໃຊ້ / Excise Tax", "10.00");
        totalTable.addRow("ອາກອນຊົມໃຊ້ / Excise Tax", "10101010");
        totalTable.addDivider('-');
        totalTable.addRow("ລວມທັງໝົດ / Grand Total", "120.00");
        totalTable.addRow("ລວມທັງໝົດ ລວມທັງໝົດລວມທັງໝົດລວມທັງໝົດລວມທັງໝົດ/ Grand Total", "120.00");
        totalTable.addRow("ລວມທັງໝົດ ລວມທັງໝົດລວມທ/ Grand Total", "120.00");
        totalTable.addRow("ລວມທັງໝົດ ລວມທັງໝົດລວມທັ/ Grand Total", "300");
        totalTable.addRow("ລວມທັງໝົດ ລວມທັງໝົດລວມທ/ Grand Total", "ງໝົດລວມທັງໝົດລວມທັງໝົດ");
        totalTable.addRow("ລວມທັງໝົດ/ Grand Total", "ງໝົດລວມທັງໝົດລວມທັງໝົດ");
        totalTable.addDivider('-');

        printer.printText(totalTable.generate());
    }

    private static String padRight(String s, int width) {
        StringBuilder sb = new StringBuilder(s);
        while (sb.length() < width) sb.append(" ");
        return sb.toString();
    }

    private static String padLeft(String s, int width) {
        StringBuilder sb = new StringBuilder();
        while (sb.length() + s.length() < width) sb.append(" ");
        sb.append(s);
        return sb.toString();
    }


    // --- 1. 最小间距测试 (colSpacing = 1) ---
    // 适合需要展示很多信息的场景。总宽：24+1+8+1+12 = 46 (80mm极限)
    private static void testSmallSpacing(PrinterInterface printer) {
        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable table = new LaoAlignedTable(new int[]{22, 8, 12}, aligns);
//        table.setColumnAlign(0, LaoAlignedTable.Align.LEFT);
//        table.setColumnAlign(1, LaoAlignedTable.Align.CENTER);
//        table.setColumnAlign(2, LaoAlignedTable.Align.RIGHT);
        printer.printText("\n--- TEST 1: SMALL SPACING (1) ---\n");
        table.addRow("ITEM DESCRIPTION", "QTY", "AMOUNT");
        table.addRow("Beer Lao Gold Special 640mlBeer Lao Gold Special 640mlBeer Lao Gold Special 640ml", "10", "250,000");
        table.addRow("Khao Phad Moo Grob Extra\\ນ້ຳດື່ມບໍລິສຸດຕາຫົວ", "1", "45,000");
        table.addRow("Khao Phad Moo Grob Extra\\ເສືອຂະໜາດໃຫຍ່ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ", "1", "45,000");
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວ\\ເສືອຂະໜາດໃຫຍ່ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ", "0", "45,000");
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ", "11", "45,000");
        table.addRow("ນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫ", "22", "45,000");
        table.addRow("ນ້ຳ", "2", "45,000");
        table.addRow("english", "3", "45,000");
        table.addRow("TOTAL LAK", "", "295,000");
        Log.e("testSmallSpacing", "testSmallSpacing: " + table.generate());
        printer.printText(table.generate());
    }

    // --- 2. 最大间距测试 (colSpacing = 4) ---
    // 此时必须压缩列宽，否则会溢出。总宽：18+4+6+4+10 = 42 (安全)
    private static void testLargeSpacing(PrinterInterface printer) {
        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable table = new LaoAlignedTable(new int[]{13, 5, 10}, aligns);
//        table.setColumnAlign(1, LaoAlignedTable.Align.CENTER);
//        table.setColumnAlign(2, LaoAlignedTable.Align.RIGHT);

        printer.printText("\n--- TEST 2: LARGE SPACING (4) ---\n");
//        table.addDivider('*');
        table.addRow("MENU", "QTY", "PRICE");
//        table.addDivider('-');
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່Iced Coffee", "2", "30,000");
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່Hot Green Tea", "1", "15,000");
//        table.addDivider('*');
        printer.printText(table.generate());
    }

    // --- 3. 极端换行测试 (考验文字切分逻辑) ---
    // 故意让第一列和第二列都发生换行
    private static void testExtremeWrapping(PrinterInterface printer) {
        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable table = new LaoAlignedTable(new int[]{15, 10, 10}, aligns);

        printer.printText("\n--- TEST 3: EXTREME WRAPPING ---\n");
//        table.addDivider('=');
        // 第一列文本超长，第二列文本也超长
        table.addRow("VeryLongProductNameThatWillWrap", "SpecialNoteThatIsTooLong", "100,000100,000100,000");
        // 老挝文换行测试
        table.addRow("ນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ່", "ກະລຸນາສົ່ງດ່ວນ", "50,000");
//        table.addDivider('=');
        printer.printText(table.generate());
    }

    // --- 4. 两列布局测试 (大跨度) ---
    // 配置：10(标签) + 4(空) + 28(内容) = 42
    private static void testTwoColumnLayout(PrinterInterface printer) {
        Align[] aligns = {Align.LEFT, Align.CENTER, Align.RIGHT};
        LaoAlignedTable table = new LaoAlignedTable(new int[]{10, 28}, aligns);

        printer.printText("\n--- TEST 4: TWO COLUMN LAYOUT ---\n");
        table.addRow("CUSTOMER:", "Mr. Somchai Phomvihane");
        table.addRow("ADDRESS:", "Baan Phonexay, Unit 12, Saysettha District, Vientiane Capital");
        table.addRow("REMARKນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ:", "Please handle the package with extra care.");
//        table.addDivider('-');
        printer.printText(table.generate());
        printer.printText("\n\n\n\n"); // 留白切纸
        Align[] aligns2 = {Align.LEFT, Align.RIGHT};
        LaoAlignedTable table5 = new LaoAlignedTable(new int[]{10, 28}, aligns2);

        printer.printText("\n--- TEST 5: TWO COLUMN LAYOUT ---\n");
        table5.addRow("CUSTOMER:", "Mr. Somchai Phomvihane");
        table5.addRow("ADDRESS:", "Baan Phonexay, Unit 12, Saysettha District, Vientiane Capital");
        table5.addRow("REMARKນ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ້ຳດື່ມບໍລິສຸດຕາຫົວເສືອຂະໜາດໃຫຍ:", "Please handle the package with extra care.");
//        table5.addDivider('-');
        printer.printText(table5.generate());
        printer.printText("\n\n\n\n"); // 留白切纸
    }
}