# -*- coding: utf-8 -*-
"""TRA_CHO_DUNG.PY — voi moi tham so Inp*, tim MOI CHO MA NGUON DUNG NO.

VI SAO CAN
----------
Chu thich canh dong khai bao chi noi tham so TEN LA GI. Muon viet dien giai
dung thi phai doc cho ma THUC SU DUNG no — mot tham so ten "MaxLoss" co the
duoc so sanh o ba cho khac nhau voi ba y nghia khac nhau.

Chu du an dan: "can doc cu the code de hieu tinh nang va dien giai cac tham
so cho chuan. Chuan tu tai lieu goc thi cac phan khac se don gian va chuan hon."

Chay:
    python tra_cho_dung.py                 -> bang tom tat moi tham so
    python tra_cho_dung.py InpMaxLoss      -> in tung dong dung tham so do
"""
import io, os, re, sys
from collections import defaultdict

GOC = r'G:/server tin hieu/systemai/dca/ea'
TEP_KHAI = 'include/config/DCA_Inputs.mqh'


def doc(p):
    for bm in ('utf-8', 'utf-8-sig', 'cp1258', 'latin-1'):
        try:
            return io.open(p, encoding=bm).read()
        except (UnicodeDecodeError, LookupError):
            continue
    return ''


def cac_tham_so():
    s = doc(os.path.join(GOC, TEP_KHAI))
    return sorted(set(re.findall(r'^\s*(?:input|sinput)\s+\S+\s+(\w+)\s*=', s, re.M)))


def quet_toan_bo():
    """Tra {ten_tham_so: [(duong_dan_tuong_doi, so_dong, noi_dung), ...]}."""
    ten = cac_tham_so()
    mau = {t: re.compile(r'\b' + re.escape(t) + r'\b') for t in ten}
    ra = defaultdict(list)
    for thu, _, teps in os.walk(GOC):
        for t in teps:
            if not t.endswith(('.mqh', '.mq5')):
                continue
            p = os.path.join(thu, t)
            rel = os.path.relpath(p, GOC).replace(os.sep, '/')
            if rel == TEP_KHAI:          # bo chinh cho khai bao
                continue
            s = doc(p)
            if not s:
                continue
            for i, d in enumerate(s.splitlines(), 1):
                for k, m in mau.items():
                    if m.search(d):
                        ra[k].append((rel, i, d.strip()[:150]))
    return ten, ra


def main():
    ten, ra = quet_toan_bo()
    if len(sys.argv) > 1:
        k = sys.argv[1]
        ds = ra.get(k, [])
        print('=== %s — %d chỗ dùng ===' % (k, len(ds)))
        for rel, i, d in ds:
            print('  %-46s :%-5d %s' % (rel, i, d))
        return 0

    khong_dung = [t for t in ten if not ra.get(t)]
    print('%d tham số · %d có chỗ dùng · %d KHÔNG thấy dùng ở đâu'
          % (len(ten), len(ten) - len(khong_dung), len(khong_dung)))
    print()
    print('%-34s %5s  %s' % ('tham số', 'chỗ', 'tệp dùng nhiều nhất'))
    print('-' * 92)
    for t in ten:
        ds = ra.get(t, [])
        if not ds:
            continue
        dem = defaultdict(int)
        for rel, _, _ in ds:
            dem[rel] += 1
        top = sorted(dem.items(), key=lambda x: -x[1])[:2]
        print('%-34s %5d  %s' % (t, len(ds),
                                 ', '.join('%s(%d)' % (os.path.basename(a), b) for a, b in top)))
    if khong_dung:
        print()
        print('KHÔNG THẤY DÙNG (%d) — có thể là tham số chết, cần hỏi lại:' % len(khong_dung))
        for t in khong_dung:
            print('   ', t)
    return 0


if __name__ == '__main__':
    sys.exit(main())
