package com.jwipc.util;

import java.math.BigDecimal;

public class MoneyToChineseUtil {
    // 数字大写字符
    private static final String[] CN_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    // 单位大写字符
    private static final String[] CN_UNITS = {"", "拾", "佰", "仟"};
    private static final String[] CN_GROUP_UNITS = {"", "万", "亿", "兆"};
    private static final String CN_YUAN = "元";
    private static final String CN_JIAO = "角";
    private static final String CN_FEN = "分";
    private static final String CN_ZERO = "零";
    private static final String CN_FULL = "整";

    /**
     * 将数字金额转换为中文大写金额
     * @param amount 金额数字
     * @return 中文大写金额字符串
     */
    public static String convertToChinese(BigDecimal amount) {
        // 处理负数
        boolean isNegative = false;
        if (amount.compareTo(BigDecimal.ZERO) < 0) {
            isNegative = true;
            amount = amount.abs();
        }

        // 四舍五入到分
        amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
        String amountStr = amount.toString();

        // 分割整数和小数部分
        String[] parts = amountStr.split("\\.");
        String integerPart = parts[0];  // 整数部分
        String decimalPart = parts.length > 1 ? parts[1] : "00";  // 小数部分

        // 转换整数部分
        String integerResult = convertIntegerPart(integerPart);

        // 转换小数部分
        String decimalResult = convertDecimalPart(decimalPart);

        // 组合结果
        StringBuilder result = new StringBuilder();
        if (isNegative) {
            result.append("负");
        }
        result.append(integerResult);
        result.append(CN_YUAN);
        result.append(decimalResult);

        // 处理特殊情况
        if (decimalResult.isEmpty() || decimalResult.equals(CN_FULL)) {
            result.append(CN_FULL);
        } else if (decimalResult.contains(CN_ZERO) && !decimalResult.endsWith(CN_FEN)) {
            // 处理如"零角"或"零分"的情况
            result = new StringBuilder(result.toString().replaceAll(CN_ZERO + "+$", ""));
        }

        return result.toString();
    }

    /**
     * 转换整数部分
     * @param integerPart 整数部分字符串
     * @return 中文大写字符串
     */
    private static String convertIntegerPart(String integerPart) {
        if (integerPart.equals("0")) {
            return CN_ZERO;
        }

        StringBuilder result = new StringBuilder();
        int length = integerPart.length();
        int groupCount = (int) Math.ceil(length / 4.0);  // 分组数量

        for (int group = 0; group < groupCount; group++) {
            int start = Math.max(0, length - (group + 1) * 4);
            int end = length - group * 4;
            String groupStr = integerPart.substring(start, end);

            String groupResult = convertGroup(groupStr);
            if (!groupResult.isEmpty()) {
                // 添加组单位（万、亿等）
                result.insert(0, groupResult + CN_GROUP_UNITS[group]);
            }
        }

        // 处理连续的零
        String temp = result.toString();
        while (temp.contains(CN_ZERO + CN_ZERO)) {
            temp = temp.replace(CN_ZERO + CN_ZERO, CN_ZERO);
        }
        // 处理零在单位前的情况
        temp = temp.replaceAll(CN_ZERO + "[万仟佰拾]", "");
        // 处理开头的零
        if (temp.startsWith(CN_ZERO)) {
            temp = temp.substring(1);
        }
        // 处理结尾的零
        if (temp.endsWith(CN_ZERO)) {
            temp = temp.substring(0, temp.length() - 1);
        }

        return temp;
    }

    /**
     * 转换4位数字组
     * @param group 4位数字字符串
     * @return 中文大写字符串
     */
    private static String convertGroup(String group) {
        StringBuilder result = new StringBuilder();
        int length = group.length();
        boolean zeroFlag = false;  // 标记是否需要添加零

        for (int i = 0; i < length; i++) {
            int num = group.charAt(i) - '0';
            int unitPos = length - i - 1;  // 单位位置

            if (num != 0) {
                if (zeroFlag) {
                    result.append(CN_ZERO);
                    zeroFlag = false;
                }
                result.append(CN_NUMBERS[num]);
                result.append(CN_UNITS[unitPos]);
            } else {
                zeroFlag = true;
            }
        }

        return result.toString();
    }

    /**
     * 转换小数部分
     * @param decimalPart 小数部分字符串
     * @return 中文大写字符串
     */
    private static String convertDecimalPart(String decimalPart) {
        StringBuilder result = new StringBuilder();
        int jiao = decimalPart.length() > 0 ? decimalPart.charAt(0) - '0' : 0;
        int fen = decimalPart.length() > 1 ? decimalPart.charAt(1) - '0' : 0;

        // 处理角
        if (jiao != 0) {
            result.append(CN_NUMBERS[jiao]);
            result.append(CN_JIAO);
        } else if (fen != 0) {
            // 如果角为零但分不为零，需要添加零
            result.append(CN_ZERO);
        }

        // 处理分
        if (fen != 0) {
            result.append(CN_NUMBERS[fen]);
            result.append(CN_FEN);
        }

        return result.toString();
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(convertToChinese(new BigDecimal("70488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("710488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("7010488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("71010488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("701010488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("7001010488.03")));  // 柒万零肆佰捌拾捌元零叁分
        System.out.println(convertToChinese(new BigDecimal("405.05")));    // 肆佰零伍元零伍分
        System.out.println(convertToChinese(new BigDecimal("1000.00")));   // 壹仟元整
        System.out.println(convertToChinese(new BigDecimal("0.05")));      // 零元零伍分
        System.out.println(convertToChinese(new BigDecimal("100.50")));    // 壹佰元伍角整
        System.out.println(convertToChinese(new BigDecimal("1234.56")));   // 壹仟贰佰叁拾肆元伍角陆分
        System.out.println(convertToChinese(new BigDecimal("1000000.00"))); // 壹佰万元整
        System.out.println(convertToChinese(new BigDecimal("1000000.01"))); // 壹佰万元零壹分
        System.out.println(convertToChinese(new BigDecimal("1000000.10"))); // 壹佰万元壹角整
        System.out.println(convertToChinese(new BigDecimal("1000000.11"))); // 壹佰万元壹角壹分
        System.out.println(convertToChinese(new BigDecimal("0.00")));       // 零元整
        System.out.println(convertToChinese(new BigDecimal("-123.45")));   // 负壹佰贰拾叁元肆角伍分
        System.out.println(convertToChinese(new BigDecimal("1001000.00"))); // 壹佰万壹仟元整
        System.out.println(convertToChinese(new BigDecimal("1001001.01"))); // 壹佰万壹仟零壹元零壹分
    }
}