#ifndef VPR_ROUTER_LOOKAHEAD_H
#define VPR_ROUTER_LOOKAHEAD_H
#include <memory>
#include "vpr_types.h"
#include "vpr_error.h"

struct t_conn_cost_params; //Forward declaration

class RouterLookahead {
  public:
    // Get expected cost from node to target_node.
    //
    // Either compute or read methods must be invoked before invoking
    // get_expected_cost.
    virtual float get_expected_cost(int node, int target_node, const t_conn_cost_params& params, float R_upstream) const = 0;

    // Compute router lookahead (if needed).
    virtual void compute(const std::vector<t_segment_inf>& segment_inf) = 0;

    // Read router lookahead data (if any) from specified file.
    // May be unimplemented, in which case method should throw an exception.
    virtual void read(const std::string& file) = 0;

    // Write router lookahead data (if any) to specified file.
    // May be unimplemented, in which case method should throw an exception.
    virtual void write(const std::string& file) const = 0;

    virtual ~RouterLookahead() {}
};

// Force creation of lookahead object.
//
// This may involve recomputing the lookahead, so only use if lookahead cache
// cannot be used.
std::unique_ptr<RouterLookahead> make_router_lookahead(
    e_router_lookahead router_lookahead_type,
    std::string write_lookahead,
    std::string read_lookahead,
    const std::vector<t_segment_inf>& segment_inf);

// Clear router lookahead cache (e.g. when changing or free rrgraph).
void invalidate_router_lookahead_cache();

// Returns lookahead for given rr graph.
//
// Object is cached in RouterContext, but access to cached object should
// performed via this function.
const RouterLookahead* get_cached_router_lookahead(
    e_router_lookahead router_lookahead_type,
    std::string write_lookahead,
    std::string read_lookahead,
    const std::vector<t_segment_inf>& segment_inf);

class ClassicLookahead : public RouterLookahead {
  public:
    float get_expected_cost(int node, int target_node, const t_conn_cost_params& params, float R_upstream) const override;
    void compute(const std::vector<t_segment_inf>& /*segment_inf*/) override {
    }

    void read(const std::string& /*file*/) override {
        VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::read unimplemented");
    }
    void write(const std::string& /*file*/) const override {
        VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::write unimplemented");
    }

  private:
    float classic_wire_lookahead_cost(int node, int target_node, float criticality, float R_upstream) const;
};

class MapLookahead : public RouterLookahead {
  protected:
    float get_expected_cost(int node, int target_node, const t_conn_cost_params& params, float R_upstream) const override;
    void compute(const std::vector<t_segment_inf>& segment_inf) override;
    void read(const std::string& /*file*/) override {
        VPR_THROW(VPR_ERROR_ROUTE, "MapLookahead::read unimplemented");
    }
    void write(const std::string& /*file*/) const override {
        VPR_THROW(VPR_ERROR_ROUTE, "MapLookahead::write unimplemented");
    }
};

class NoOpLookahead : public RouterLookahead {
  protected:
    float get_expected_cost(int node, int target_node, const t_conn_cost_params& params, float R_upstream) const override;
    void compute(const std::vector<t_segment_inf>& /*segment_inf*/) override {
    }
    void read(const std::string& /*file*/) override {
        VPR_THROW(VPR_ERROR_ROUTE, "Read not supported for NoOpLookahead");
    }
    void write(const std::string& /*file*/) const override {
        VPR_THROW(VPR_ERROR_ROUTE, "Write not supported for NoOpLookahead");
    }
};

#endif
