"""Bounded dose maps with explicit assumptions; no calibrated efficacy claims."""
import itertools
import json
import hashlib
from pathlib import Path
from dataclasses import asdict
from forecast_v2 import Assumptions
from intervention_actions_v2 import contrast

HERE=Path(__file__).resolve().parent

def actions():
    for remaining,leak in itertools.product((0.,.25,.5,.75,1.),(0.,.1,.25)):
        yield 'silencing',dict(mutant_multiplier=remaining,wt_multiplier=1-leak)
    for factor in (1.,1.25,1.5,2.,4.):
        yield 'WT_addition',dict(added_wt=factor-1)
        yield 'proportional_upregulation',dict(wt_multiplier=factor,mutant_multiplier=factor)
        yield 'preferential_upregulation',dict(wt_multiplier=factor,mutant_multiplier=1+(factor-1)*.25)
    for value in (0.,.25,.5,.75,1.):
        yield 'survival_modulation',dict(survival=value)
    for factor in (0.,.5,1.):
        yield 'burden_modulation',dict(susceptibility=2*factor)
        yield 'coupling_modulation',dict(coupling=factor)
    yield 'silencing_plus_WT',dict(mutant_multiplier=.5,added_wt=1)

def main():
    rows=[]
    for model,delivery,u,k,a in itertools.product(
        ('null','surviving_burden','failed_processing','surviving_defective'),
        ('independent','mutant_total_input_attenuation','joint_total_input'),
        (.1,.5,.9),(0.,2.),(0.,.2,1.)):
        p=Assumptions(model,delivery,u,1.,2.,k,a,1.)
        for name,action in actions():
            result=contrast(1.,1.,p,**action)
            rows.append(dict(intervention=name,action=action,assumptions=asdict(p),**result))
    output=dict(label='CONDITIONAL DOSE MAP; NOT MEASUREMENT OR BIOLOGICAL PROBABILITIES',
                baseline='WT synthesis=mutant synthesis=1; reference current WT-only W=1',
                caveat='Fixed competition/coupling and limited uncalibrated domains; no universal ranking.',
                hashes={n:hashlib.sha256((HERE/n).read_bytes()).hexdigest() for n in
                        ('forecast_v2.py','intervention_actions_v2.py','dose_response_v2.py')},
                count=len(rows),rows=rows)
    with (HERE/'dose_response_v2.json').open('x') as f:json.dump(output,f,indent=2)
    print(f'Saved {len(rows)} dose comparisons with matched WT controls.')

if __name__=='__main__':main()
