# -*- coding: utf-8 -*-
"""BAO_CAO_RIENG.PY — báo cáo TỰ CHẤM bản tin, gửi RIÊNG cho chủ shop qua Telegram (03/10/2026).

Chủ dự án: "phần tự chấm chỉ gửi báo cáo cho tôi về tk riêng, không gửi theo bản tin". Mọi phần tự chấm đã bỏ khỏi bài đăng
(viet.py); ở đây chỉ dựng văn bản từ số code đã chấm (phan_tich.tu_cham_hom_qua / tong_ket_tuan / tam_nhin_thang) rồi gửi
vào chat riêng của chủ (bảng system: access_token, chat_id — cùng chỗ thẻ duyệt nạp / bài đăng).
Cách chấm: kịch bản xảy ra = kịch bản CHẠM MỤC TIÊU TRƯỚC; không mục tiêu nào chạm = đi ngang.
"""
from __future__ import annotations

from typing import Any, Dict, List, Optional

TEN_KB = {'tang': 'tăng', 'giam': 'giảm', 'di_ngang': 'đi ngang'}


def _so(x: Optional[float], le: int = 2) -> str:
    if x is None:
        return '—'
    return f'{x:,.{le}f}'.replace(',', '§').replace('.', ',').replace('§', '.')


def van_ban_ngay(tc: Dict[str, Any]) -> str:
    """Tự chấm MỘT bản tin (kết quả tu_cham_hom_qua)."""
    mt = tc['muc_tieu_hom_qua']
    if tc['kich_ban_xay_ra'] == 'di_ngang':
        xay_ra = f"không chạm mục tiêu nào (tăng {_so(mt['tang'])}, giảm {_so(mt['giam'])}) → đi ngang"
    else:
        xay_ra = (f"chạm mục tiêu {TEN_KB[tc['kich_ban_xay_ra']]} {_so(mt[tc['kich_ban_xay_ra']])} trước, "
                  f"lúc {tc['luc_cham_muc_tieu']}")
    dong = [f"📋 TỰ CHẤM bản tin {tc['ban_tin_ngay'][8:]}/{tc['ban_tin_ngay'][5:7]} (chỉ gửi riêng anh)",
            f"- Kịch bản xảy ra: {xay_ra}"]
    if tc.get('kich_hoat_truoc'):
        dong.append(f"- Mức kích hoạt {TEN_KB[tc['kich_hoat_truoc']]} bị vượt trước (nến H1 đóng qua lúc {tc['luc_kich_hoat']})")
    dong.append(f"- Kịch bản thuận bối cảnh hôm đó: {TEN_KB.get(tc.get('thuan_boi_canh'), 'không có')}")
    g = tc['gia_that']
    dong.append(f"- Giá thật: cao {_so(g['cao'])}, thấp {_so(g['thap'])}")
    bd = tc.get('bien_do_du_kien_hom_qua')
    if bd:
        dong.append('- Biên độ dự kiến: ' + ('VƯỢT TRẦN' if bd['vuot_tran'] else 'THỦNG SÀN' if bd['thung_san'] else 'giữ được')
                    + f" (trần {_so(bd['tran'])}, sàn {_so(bd['san'])})")
    dong.append('- Vùng đã chạm: ' + (', '.join(tc['vung_da_cham']) or 'không'))
    for x in tc.get('tin_da_ra') or []:
        so_lieu = '; '.join(f"{t['ten']} {t['thuc_te']} / dự báo {t['du_bao'] or '—'}" for t in x['tin'] if t['thuc_te'])
        dong.append(f"- Tin {x['gio']}: {so_lieu} → vàng chạy {_so(x['vang_chay_2h'])} giá, "
                    f"{'tăng' if x['huong_2h'] > 0 else 'giảm'} {_so(abs(x['huong_2h']))} sau 2 giờ")
    return '\n'.join(dong)


def van_ban_tong_hop(cham: List[Dict[str, Any]], tieu_de: str) -> str:
    """Thống kê nhiều bản tin (tuần / tháng)."""
    n = len(cham)
    dem = {k: sum(1 for c in cham if c['xay_ra'] == k) for k in ('di_ngang', 'tang', 'giam')}
    trong = [c for c in cham if c.get('trong_bien_do_du_kien') is not None]
    thuan = [c for c in cham if c.get('thuan_boi_canh')]
    dong = [f"📋 TỰ CHẤM {tieu_de} (chỉ gửi riêng anh)",
            f"- {n} bản tin: {dem['di_ngang']} ngày không chạm mục tiêu nào, {dem['tang']} ngày chạm mục tiêu tăng trước, "
            f"{dem['giam']} ngày chạm mục tiêu giảm trước"]
    if trong:
        dong.append(f"- Giá nằm trong trần/sàn dự kiến {sum(1 for c in trong if c['trong_bien_do_du_kien'])}/{len(trong)} ngày")
    if thuan:
        dong.append(f"- Ngày có kịch bản thuận bối cảnh: {len(thuan)}; xảy ra đúng kịch bản đó "
                    f"{sum(1 for c in thuan if c['xay_ra'] == c['thuan_boi_canh'])}/{len(thuan)}")
    if n <= 7:
        for c in cham:
            dong.append(f"  · {c['ngay'][8:]}/{c['ngay'][5:7]}: {TEN_KB[c['xay_ra']]}"
                        + ('' if c.get('trong_bien_do_du_kien') is None else
                           ', trong biên độ dự kiến' if c['trong_bien_do_du_kien'] else ', ra ngoài biên độ dự kiến'))
    return '\n'.join(dong)


def gui(van_ban: str, _lay_ket_noi=None, _tele_goi=None) -> bool:
    """Gửi vào chat riêng của chủ shop. Lỗi thì trả False (không làm hỏng việc đăng bản tin)."""
    from congcu import csdl
    from kenh.phieu import _cau_hinh_tele, _tele
    try:
        token, chat = csdl.voi_ct(_lay_ket_noi, _cau_hinh_tele)
    except RuntimeError:
        return False
    if not token or not chat:
        return False
    j = (_tele_goi or (lambda pt, dl: _tele(token, pt, dl)))('sendMessage', {'chat_id': chat, 'text': van_ban[:4000],
                                                                            'disable_web_page_preview': True})
    return bool(j and j.get('ok'))


if __name__ == '__main__':
    tc = {'ban_tin_ngay': '2026-10-01', 'kich_ban_xay_ra': 'di_ngang', 'luc_cham_muc_tieu': None, 'thuan_boi_canh': 'giam',
          'muc_tieu_hom_qua': {'tang': 4208.39, 'giam': 4107.34}, 'kich_hoat_truoc': 'tang', 'luc_kich_hoat': '01/10 10:00',
          'gia_that': {'cao': 4192.8, 'thap': 4139.3}, 'bien_do_du_kien_hom_qua': {'tran': 4242.76, 'san': 4071.06,
          'vuot_tran': False, 'thung_san': False}, 'vung_da_cham': ['kháng cự 1 (4.159,83–4.174,43)'], 'tin_da_ra': []}
    v = van_ban_ngay(tc)
    assert 'đi ngang' in v and 'giữ được' in v and '4.208,39' in v, v
    t = van_ban_tong_hop([{'ngay': '2026-09-21', 'xay_ra': 'di_ngang', 'trong_bien_do_du_kien': True, 'thuan_boi_canh': None},
                          {'ngay': '2026-09-22', 'xay_ra': 'giam', 'trong_bien_do_du_kien': False, 'thuan_boi_canh': 'giam'}], 'tuần')
    assert '2 bản tin: 1 ngày' in t and '1/2 ngày' in t and 'đúng kịch bản đó 1/1' in t, t
    print('TỰ KIỂM ban_tin/bao_cao_rieng.py QUA.')
