"""Cross-check from source XML and raw GDP records, without using openpyxl or main code."""
import csv,json,math,zipfile
from pathlib import Path
from fractions import Fraction
from xml.etree import ElementTree as ET
ROOT=Path(__file__).resolve().parents[1]
D=ROOT/'data';R=ROOT/'results';NS={'m':'http://schemas.openxmlformats.org/spreadsheetml/2006/main'}
with zipfile.ZipFile(D/'national-fossil-2025.xlsx') as z:
    strings=[]
    for item in ET.fromstring(z.read('xl/sharedStrings.xml')).findall('m:si',NS):
        strings.append(''.join(e.text or '' for e in item.findall('.//m:t',NS)))
    def sheet(file,header_index):
        cells={}
        for row in ET.fromstring(z.read(file)).findall('m:sheetData/m:row',NS):
            n=int(row.attrib['r']);values={}
            for cell in row.findall('m:c',NS):
                letters=''.join(c for c in cell.attrib['r'] if c.isalpha());col=0
                for letter in letters:col=col*26+ord(letter)-ord('A')+1
                value=cell.find('m:v',NS)
                if value is None or value.text is None:continue
                values[col]=strings[int(value.text)] if cell.attrib.get('t')=='s' else Fraction(value.text)
            cells[n]=values
        header=cells[header_index];out={}
        for row in cells.values():
            year=row.get(1)
            if isinstance(year,Fraction) and year.denominator==1 and 2005<=year<=2023:
                out[int(year)]={name:row.get(col) for col,name in header.items() if col!=1}
        return out
    t=sheet('xl/worksheets/sheet2.xml',12);c=sheet('xl/worksheets/sheet3.xml',9)
raw=json.loads((D/'worldbank-gdp.json').read_text(),parse_float=Fraction)
gdp={(r['countryiso3code'],int(r['date'])):r['value'] for r in raw[1] if r['countryiso3code']}
with (R/'crosswalk.csv').open() as f:crosswalk=list(csv.DictReader(f))
with (R/'panel.csv').open() as f:panel=list(csv.DictReader(f))
checked_values=0
for row in panel:
    iso=row['iso3'];year=int(row['year']);name=row['name']
    expected=[gdp[iso,year],t[year][name],c[year][name]]
    for value,field in zip(expected,['gdp_constant_2015_usd','territorial_mtc','consumption_mtc']):
        assert math.isclose(float(value),float(row[field]),rel_tol=3e-14,abs_tol=1e-12),(iso,year,field)
        checked_values+=1
window_results=[];classifications={}
for a,b in [(2005,2019),(2005,2023),(2015,2019),(2015,2023)]:
    nt=nc=nb=0;classifications[a,b]={}
    for row in crosswalk:
        iso=row['iso3'];name=row['gcb_name'];grow=gdp[iso,b]>gdp[iso,a]
        td=grow and t[b][name]<t[a][name];cd=grow and c[b][name]<c[a][name]
        nt+=td;nc+=cd;nb+=td and cd;classifications[a,b][iso]=td and cd
    window_results.append({'window':f'{a}_{b}','territorial_absolute':nt,'consumption_absolute':nc,'both_absolute':nb})
main=json.loads((R/'window-summary.json').read_text())
for actual,declared in zip(window_results,main):
    for key,value in actual.items():assert value==declared[key],(key,value,declared[key])
smoothed={}
for row in crosswalk:
    iso=row['iso3'];name=row['gcb_name']
    growing=sum(gdp[iso,y] for y in [2021,2022,2023])>sum(gdp[iso,y] for y in [2013,2014,2015])
    smoothed[iso]=growing and all(sum(d[y][name] for y in [2021,2022,2023])<sum(d[y][name] for y in [2013,2014,2015]) for d in [t,c])
error_counts=[]
for epsilon in [Fraction(2,100),Fraction(5,100),Fraction(10,100)]:
    lower=upper=0
    for row in crosswalk:
        iso=row['iso3'];name=row['gcb_name'];grow=gdp[iso,2023]>gdp[iso,2015]
        lower+=grow and all(d[2023][name]*(1+epsilon)<d[2015][name]*(1-epsilon) for d in [t,c])
        upper+=grow and all(d[2023][name]*(1-epsilon)<d[2015][name]*(1+epsilon) for d in [t,c])
    error_counts.append({'delta':float(epsilon),'lower':lower,'upper':upper})
for actual,declared in zip(error_counts,json.loads((R/'endpoint-error-scenarios.json').read_text())):
    assert actual['lower']==declared['both_definite_n'] and actual['upper']==declared['both_possible_n']
R1=json.loads((R/'R1.json').read_text())
assert sum(smoothed.values())==R1['smooth_both_n']
consistent=sum(all(d[i] for d in classifications.values()) and smoothed[i] for i in smoothed)
assert consistent==R1['consistent_both_all_windows_n']
result={'source_values_checked':checked_values,'all_source_values_match':True,'all_endpoint_counts_match':True,'all_smoothed_counts_match':True,'all_joint_error_bounds_match':True,'method':'Source XLSX XML parsed with ElementTree; exact rational comparisons from stored decimal literals; raw World Bank GDP JSON parsed as fractions.'}
(R/'R2.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result,indent=2))
