#!/usr/bin/env python3
from pathlib import Path
import re,sys
files=[Path(x) for x in sys.argv[1:]]
issues=[]; checked=0
# conservative: direct call with quoted SQL then immediate [..] array, no nested closing complexities beyond strings/parens
pat=re.compile(r'\b(balt_exec|balt_insert|balt_all|balt_one|balt_value)\s*\(\s*(["\'])',re.M)

def parse_string(s,i,quote):
    out=[]; i+=1; esc=False
    while i<len(s):
        c=s[i]
        if esc: out.append(c);esc=False
        elif c=='\\': out.append(c);esc=True
        elif c==quote: return ''.join(out),i+1
        else: out.append(c)
        i+=1
    return None,i

def count_array_items(s,i):
    # i at [
    depth=0; quote=None; esc=False; par=0;br=0;cur=0; items=0; nonspace=False
    j=i
    while j<len(s):
        c=s[j]
        if quote:
            if esc: esc=False
            elif c=='\\': esc=True
            elif c==quote: quote=None
            j+=1; continue
        if c in ('"',"'"): quote=c;j+=1;continue
        if c=='[': br+=1
        elif c==']':
            br-=1
            if br==0:
                if nonspace: items+=1
                return items,j+1
        elif c=='(' : par+=1
        elif c==')' : par-=1
        elif c==',' and br==1 and par==0:
            items+=1;nonspace=False;j+=1;continue
        elif br==1 and not c.isspace(): nonspace=True
        j+=1
    return None,j

for f in files:
    s=f.read_text(errors='ignore')
    for m in pat.finditer(s):
        fn=m.group(1); quote=m.group(2); sql,end=parse_string(s,m.start(2),quote)
        if sql is None: continue
        k=end
        while k<len(s) and s[k].isspace(): k+=1
        if k>=len(s) or s[k]!=',': continue
        k+=1
        while k<len(s) and s[k].isspace(): k+=1
        if k>=len(s) or s[k]!='[': continue
        items,end2=count_array_items(s,k)
        if items is None: continue
        q=sql.count('?')
        checked+=1
        if q!=items:
            line=s.count('\n',0,m.start())+1
            issues.append((str(f),line,fn,q,items,sql[:160]))
print(f'CHECKED={checked} ISSUES={len(issues)}')
for x in issues:
    print('ISSUE',x)
if issues: sys.exit(1)
