# -*- coding: utf-8 -*-
"""举文财务管理系统 · 自检骨架（第 6 讲）

一条命令跑完，告诉我红还是绿。

============================================================
  学员要做的只有一件事：把下面四个 check_ 函数里的 TODO 换成真的比对。
  现在直接跑，四项全红 —— 这是**对的**，说明骨架还是空的。
============================================================

怎么跑：
    python 自检骨架.py

退出码（这一条很重要，别去掉）：
    全过 0 ／ 有没过 1
    —— 这样以后才能把它挂到自动检查上。

★ 写完之后必须做第 6 讲那件事：
  把其中一条**故意改坏**，再跑一次，看它是不是真的会红。
  绿灯不算数，红灯才算数。
"""
import sys


def check_money_is_int():
    """检查 1：金额在数据库里存的是整数分。

    要做的：把一条流水存进去（比如 1234.56 元），再取出来，
            断言取回来的是 int，而且等于 123456。
    返回：(过了吗, 说明)  —— 没过的时候说明里要带上**实际值**。
    """
    # TODO: 换成真的比对
    return False, '还没写：把一条流水存进去再取出来，断言它是 int 且等于分'


def check_manual_matches_system():
    """检查 2：手工算的一个数，和系统算的对不对。

    要做的：用第 1 讲那条判据。录两笔流水，然后拿同样的输入
            走一遍系统的统计函数，比对结果。
    返回：(过了吗, 说明)
    """
    # TODO: 换成真的比对
    return False, '还没写：用第 1 讲那条判据，手工算的数 vs 系统算的数'


def check_receivable_settles_to_zero():
    """检查 3：应收分两次收完，欠款是不是精确变成 0。

    要做的：登记一笔 10000 元的应收，分两次收 6000 和 4000，
            断言剩余欠款 == 0（不是 0.0000001，也不是「差 1 分」）。
    返回：(过了吗, 说明)
    """
    # TODO: 换成真的比对
    return False, '还没写：10000 分两次收 6000 和 4000，欠款必须精确为 0'


def check_unit_cost_times_weight():
    """检查 4：单吨成本乘回重量，等不等于总成本。

    要做的：建一张重量 3 吨、总成本 10000 元的单，
            断言「单吨成本 × 3 == 10000」精确成立（不能有尾差）。
    返回：(过了吗, 说明)
    """
    # TODO: 换成真的比对
    return False, '还没写：3 吨 / 10000 元，单吨成本乘回 3 吨必须等于 10000.00'


CHECKS = [
    ('金额存的是整数分', check_money_is_int),
    ('手工算的和系统算的一样', check_manual_matches_system),
    ('应收两次收完欠款精确为 0', check_receivable_settles_to_zero),
    ('单吨成本乘回重量等于总成本', check_unit_cost_times_weight),
]


def main():
    bad = 0
    for name, fn in CHECKS:
        try:
            ok, detail = fn()
        except Exception as e:
            # 抛异常也算「没过」，但要把它单独说出来 ——
            # 一个检查如果崩了却算成过了，比没有检查更坏。
            ok, detail = False, f'抛异常：{type(e).__name__}: {e}'
        print(('[过了] ' if ok else '[没过] ') + name)
        if detail:
            print('        ' + str(detail))
        if not ok:
            bad += 1

    print('-' * 46)
    if bad:
        print(f'一共 {len(CHECKS)} 项，没过 {bad} 项')
    else:
        print(f'一共 {len(CHECKS)} 项，全过了')
    return 1 if bad else 0


if __name__ == '__main__':
    sys.exit(main())
