#!/usr/bin/env python3
"""Offline example for five country formats; not a production bank validator.

Run: python3 verify.py [iban-cases.json]
Uses only the Python standard library, no network, accounts or API keys.
"""
import json
from pathlib import Path
import re
import sys

FORMATS = {
    'DE': r'DE[0-9]{20}', 'GB': r'GB[0-9]{2}[A-Z]{4}[0-9]{14}',
    'FR': r'FR[0-9]{12}[A-Z0-9]{11}[0-9]{2}',
    'NO': r'NO[0-9]{13}', 'BE': r'BE[0-9]{14}',
}


def format_valid(raw):
    value = re.sub(r'\s+', '', str(raw)).upper()
    pattern = FORMATS.get(value[:2])
    if not pattern or not re.fullmatch(pattern, value):
        return False
    rearranged = value[4:] + value[:4]
    digits = ''.join(str(ord(char) - 55) if char.isalpha() else char for char in rearranged)
    return int(digits) % 97 == 1


def main():
    path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(__file__).with_name('iban-cases.json')
    fixture = json.loads(path.read_text(encoding='utf-8'))
    if fixture.get('schema_version') != 2 or not fixture.get('source_version'):
        raise SystemExit('Unsupported or unversioned fixture contract')
    cases = fixture['cases']
    required_checks = {'format', 'mod97', 'national_checksum', 'registry_match', 'provider_scope'}
    incomplete = [case.get('id', 'unknown') for case in cases if set(case.get('checks') or {}) != required_checks]
    if incomplete:
        raise SystemExit('Incomplete validation layers: ' + ', '.join(incomplete))
    failures = [case['id'] for case in cases if format_valid(case['iban']) != case['expected_valid']]
    if failures:
        raise SystemExit('Failed cases: ' + ', '.join(failures))
    print(f'{len(cases)} IBAN format/checksum cases passed. No bank accounts were checked.')


if __name__ == '__main__':
    main()
