# -*- coding: utf-8 -*-
"""
起诉状（草稿）诉讼请求二利息计算与核对脚本
依据：起诉状草稿.txt 诉讼请求二及事实与理由部分；口径备注见《待核与待定清单》第3-8项。
用法：python3 利息计算.py
输出：屏幕打印 + 利息计算结果.txt（均在本文件夹内）
起诉日确定后，修改下方"参数区"的 起诉日 再跑一次即可。
"""
from datetime import date, timedelta
from decimal import Decimal, ROUND_HALF_UP

# ───────────────────────── 参数区 ─────────────────────────
起诉日 = date(2026, 10, 16)      # 【起诉状：起诉之日待定】暂按 2026-10-16，立案后改此处
月利率 = Decimal("0.01")          # 微信承诺"利息按一分算"，诉状暂按月利率1%主张（清单第4项：月1%/年10%待定）
年利率备用 = Decimal("0.10")      # "一分"如被理解为年利率10%的备用口径（清单第4项）
已还抵充款 = Decimal("5000")      # 2024-09-02 微信转账，诉请主张先行抵充利息（清单第3项：抵息/抵本待定）
抵充日 = date(2024, 9, 2)

借款 = [  # （本金, 起息日, 交付方式及起诉状出处）——与诉请二及事实部分逐笔对应
    (Decimal("80000"), date(2024, 3, 8),  "银行转账，起诉状第39-40行"),
    (Decimal("10000"), date(2024, 3, 10), "现金交付（借条出具当日），起诉状第44行"),
    (Decimal("20000"), date(2024, 3, 12), "茶行账户转入被告指定公司账户，起诉状第47行"),
]

LPR备选 = {
    "基数": Decimal("105000"),   # 备选方案下2025-07-01前无利息，5,000元（2024-09-02）只能抵充本金
    "起算日": date(2025, 7, 1),  # 展期届满次日（起诉状第28-29行）
    "年利率": Decimal("0.03"),   # 2025年5月20日起一年期LPR为3.0%【待核：以起诉日最新报价为准】
}
# ───────────────────────────────────────────────────────────

D2 = Decimal("0.01")


def 四舍五入(x: Decimal) -> Decimal:
    return x.quantize(D2, rounding=ROUND_HALF_UP)


def 计息(本金: Decimal, 起: date, 止: date, 日利率: Decimal) -> tuple[int, Decimal]:
    """算头不算尾：起息日计息、截止日不计息；利息=本金×日利率×天数。"""
    天数 = (止 - 起).days
    return 天数, 四舍五入(本金 * 日利率 * 天数)


def 整月余日(起: date, 止: date) -> tuple[int, int]:
    """日历上的整月数与零头天数，仅用于展示。"""
    月, 游标 = 0, 起
    while True:
        try:
            下月 = 游标.replace(month=游标.month + 1)
        except ValueError:
            下月 = 游标.replace(year=游标.year + 1, month=1)
        if 下月 <= 止:
            游标, 月 = 下月, 月 + 1
        else:
            return 月, (止 - 游标).days


行: list[str] = []


def 输出(s: str = "") -> None:
    行.append(s)
    print(s)


输出("利息计算与核对报告（脚本自动生成）")
输出(f"生成日期：{date.today().isoformat()}")
输出("依据：起诉状草稿.txt 诉讼请求二（第21-24行）、事实与理由（第39-50行）；"
     "口径备注见《待核与待定清单》第3-8项")
输出()

输出("一、计息参数")
输出(f"  月利率：{月利率:%}（微信原话\"利息按一分算\"按月利率1%主张——清单第4项：月1%或年10%待定）")
输出(f"  计息终点：{起诉日.isoformat()}【起诉状\"暂计至起诉之日\"，起诉之日待定，本报告暂按今日；"
     "诉请仍主张计至实际清偿之日，起诉后继续生息】")
输出("  天数口径：算头不算尾（起息日计息、截止日不计息），日利率＝月利率÷30")
输出()

输出("二、分笔算式（按诉请二逐笔）")
利息合计 = Decimal("0")
本金合计 = Decimal("0")
for 本金, 起息日, 说明 in 借款:
    天数, 利息 = 计息(本金, 起息日, 起诉日, 月利率 / 30)
    月数, 零头 = 整月余日(起息日, 起诉日)
    利息合计 += 利息
    本金合计 += 本金
    输出(f"  第{借款.index((本金, 起息日, 说明)) + 1}笔　本金{本金:,.0f}元（{说明}）")
    输出(f"    起止：{起息日.isoformat()} 至 {起诉日.isoformat()}，共{天数}天"
         f"（日历上为{月数}个整月零{零头}天）")
    输出(f"    算式：{本金:,.0f} × {月利率:%} ÷ 30 × {天数} = {利息:,.2f} 元")
    输出()

输出("三、合计与抵充")
输出(f"  本金合计：{本金合计:,.0f} 元")
输出(f"  利息合计（自各笔起息日至{起诉日.isoformat()}）：{利息合计:,.2f} 元")
抵充日利息 = sum(计息(p, d, 抵充日, 月利率 / 30)[1] for p, d, _ in 借款)
输出(f"  减：{抵充日.isoformat()}已还 {已还抵充款:,.0f} 元（诉请主张先行抵充利息；"
     f"截至该日已生息 {抵充日利息:,.2f} 元 > 5,000 元，抵充时点不影响合计）")
净利息 = 利息合计 - 已还抵充款
输出(f"  利息诉请暂计（至{起诉日.isoformat()}）：{净利息:,.2f} 元")
输出(f"  本金＋暂计利息合计：{本金合计 + 净利息:,.2f} 元")
输出("  注：若法院认定5,000元抵充本金（清单第3项），本金应为105,000元；"
     "各笔利息不受影响，但诉请须改列\"105,000元本金＋全额利息\"，需整体重列。")
输出()

输出("四、与起诉状核对")
核对 = [
    (本金合计 == Decimal("110000"), "本金合计110,000元＝诉请一（第18-19行）及事实部分\"交付借款110,000元\""),
    ([b for b, _, _ in 借款] == [Decimal("80000"), Decimal("10000"), Decimal("20000")],
     "三笔本金80,000／10,000／20,000元与诉请二（第21-23行）逐项一致"),
    ([d.isoformat() for _, d, _ in 借款] == ["2024-03-08", "2024-03-10", "2024-03-12"],
     "三笔起息日与诉请二一致，且与事实部分交付日一致（八万以银行凭证2024-03-08为准，清单第14项）"),
    (月利率 == Decimal("0.01"), "利率与诉请二\"按月利率1%\"一致"),
    (已还抵充款 == Decimal("5000"), "5,000元（2024-09-02）先行抵充利息，与诉请二（第23行）一致"),
]
for 通过, 说明 in 核对:
    输出(f"  {'✓' if 通过 else '✗'} {说明}")
输出("  ⚠ 诉请二\"暂计至起诉之日为【待定】元\"：本报告按暂定起诉日"
     f"{起诉日.isoformat()}填列 {净利息:,.2f} 元；起诉日最终确定后改脚本顶部参数重跑。")
输出("  ⚠ \"一分\"按月利率1%系暂定口径（清单第4项）：若按年利率10%，"
     f"同口径利息约 {sum(计息(p, d, 起诉日, 年利率备用 / 365)[1] for p, d, _ in 借款):,.2f} 元、"
     f"抵充后约 {sum(计息(p, d, 起诉日, 年利率备用 / 365)[1] for p, d, _ in 借款) - 已还抵充款:,.2f} 元。")
输出("  ⚠ 2024-12-31的3,000元按茶叶货款主张、未作抵充（清单第8项）；若被认定为还款，"
     "需另行抵减并重算。")
输出()

输出("五、备选方案（LPR逾期利息，起诉状第28-30行，均待定，仅参考）")
备选天数, 备选利息 = 计息(LPR备选["基数"], LPR备选["起算日"], 起诉日, LPR备选["年利率"] / 365)
输出(f"  口径：以105,000元为基数（2025-07-01前无约定利息，5,000元只能抵本金）、"
     f"自{LPR备选['起算日'].isoformat()}（展期届满次日）起按一年期LPR {LPR备选['年利率']:%}计至{起诉日.isoformat()}，"
     f"共{备选天数}天")
输出(f"  算式：105,000 × {LPR备选['年利率']:%} ÷ 365 × {备选天数} = {备选利息:,.2f} 元"
     "【LPR数值待核，天数按年利率÷365折算】")
输出(f"  与主方案差额：{净利息 - 备选利息:,.2f} 元（两方案差额较大，待承办律师确定，见起诉状第28-30行）")
输出()

输出("六、口径备注")
输出("  1. 不足月部分按\"月利率÷30×实际天数\"折算（与诉请\"按月利率1%\"配套的通行做法）；"
     "若按\"整月按月计、零头按日历天计\"，三笔合计约34,360.00元、抵充后约29,360.00元，"
     "相差约513元，口径待定。")
输出("  2. 天数为算头不算尾（截止日不计息）；各笔利息四舍五入至分后加总。")
输出("  3. 本脚本只做算术核对，不构成对诉请可获支持程度的判断；"
     "待定事项以《待核与待定清单》为准。")

with open("利息计算结果.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(行) + "\n")
print(f"\n[已写入 {__import__('os').path.abspath('利息计算结果.txt')}]")
