/* **********************************
 *   PlayerI.java
 *     Interface for Player intellegence.
 * **********************************/
package player;

import edu.neu.ccs.demeterf.demfgen.lib.List;
import gen.*;

/** Player Inteface to reveal the various Agent implementations */
public interface PlayerI{
    /** Responsible for Derivative Creation */
    interface CreateAgentI{
        /** Returns a newly created derivative of a different type than already existing derivatives */
        Derivative createDerivative(Player player, List<Type> existing);
    }
    /** Responsible for Buying/selection */
    interface BuyAgentI{
        /** Returns a list of Derivitives to be purchased */
        List<Derivative> buyDerivatives(List<Derivative> forSale, double account);
    }
    /** Responsible for RawMaterial Delivery */
    interface DeliverAgentI{
        /** Returns RawMaterials for the given Derivatives */
        Derivative deliverRawMaterial(Derivative needRM);
    }
    /** Responsible for RawMaterial Finishing */
    interface FinishAgentI{
        /** Returns FinishedProduct for the given Derivative */
        FinishedProduct finishDerivative(Derivative needFinish);
    }
    
    /** Returns the Player's Simple Name */
    public String getName();
    /** Return the CreateAgent responsible for Derivative Creation */
    public CreateAgentI getCreateAgent();
    /** Return the BuyAgent responsible for Buying/selection */
    public BuyAgentI getBuyAgent();
    /** Return the DeliverAgent responsible for RawMaterial Delivery */
    public DeliverAgentI getDeliverAgent();
    /** Return the FinishAgent responsible for RawMaterial Finishing */
    public FinishAgentI getFinishAgent();
}