package divisors_example;

import popcorn.*;

public class MaxSumOfDivisorsComputation extends CompoundComputation {
    private int n1,n2; // the range to be scaned
    private int maxarg;
    private int maxSum;

    public MaxSumOfDivisorsComputation(int n1, int n2) {
        this.n1=n1;
        this.n2=n2;
        maxarg=n1;
        maxSum=0;
    }

    public MaxSumOfDivisorsComputation(int n1, int n2, CompoundComputation parent) {
        super(parent);
        this.n1=n1;
        this.n2=n2;
        maxarg=n1;
        maxSum=0;
    }

    public String toString() {
        return "maxarg{div-sum(n): "+n1+".."+n2+"}";
    }

    public void start() {
        for (int i=n1; i<=n2; i++)
            new MySumOfDivisorsComputation(i,this).go();
    }

    public void completed() {
        reportResult(n1,n2,maxSum);
        done();
    }

    public void reportResult(int n1, int n2, int maxSumOfDivisors) {
    }

    public synchronized void update(int n, int sum) {
        if (sum>maxSum) {
            maxarg=n;
            maxSum=sum;
        }
    }

    public int getMaxArg() {
        return maxarg;
    }

    public int getMaxSumOfDivisors() {
        return maxSum;
    }
}

class MySumOfDivisorsComputation extends SumOfDivisorsComputation {
    public MySumOfDivisorsComputation(int n,MaxSumOfDivisorsComputation parent) {
        super(n,parent);
    }

    public void reportResult(int n, int sumOfDivisors) {
        ((MaxSumOfDivisorsComputation)getParent()).update(n,sumOfDivisors);
    }
}
