/*
 * Copyright (c) 2017. NextMove Software Ltd.
 */

package com.nmsoftware.praline;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public final class RdfRecord {

  private Rxnfile rxnfile;
  private Molfile molfile;
  private int     intRegNum;
  private int     extRegNum;
  private Map<String, String> data = new LinkedHashMap<>();

  public Rxnfile getRxnfile()
  {
    return rxnfile;
  }

  public void setRxnfile(Rxnfile rxnfile)
  {
    this.rxnfile = rxnfile;
  }

  public Molfile getMolfile()
  {
    return molfile;
  }

  public void setMolfile(Molfile molfile)
  {
    this.molfile = molfile;
  }

  public int getIntRegNum()
  {
    return intRegNum;
  }

  public void setIntRegNum(int intRegNum)
  {
    this.intRegNum = intRegNum;
  }

  public int getExtRegNum()
  {
    return extRegNum;
  }

  public void setExtRegNum(int extRegNum)
  {
    this.extRegNum = extRegNum;
  }

  public void clear()
  {
    intRegNum = 0;
    extRegNum = 0;
    rxnfile = null;
    molfile = null;
    data.clear();
  }

  public void putData(String dtype, String datum)
  {
    data.put(dtype, datum);
  }

  public Set<Map.Entry<String, String>> getDataEntries()
  {
    return data.entrySet();
  }

  public String getDatum(String dtype)
  {
    return data.get(dtype);
  }

  public static final class Molfile {
    private String title;
    private String content;

    public String getTitle()
    {
      return title;
    }

    public void setTitle(String title)
    {
      this.title = title;
    }

    public String getContent()
    {
      return content;
    }

    public void setContent(String content)
    {
      this.content = content;
    }

    @Override
    public String toString()
    {
      return content;
    }
  }

  public static final class Rxnfile {
    private String title;
    private String header;
    private String remark;
    private final List<Molfile> reactants = new ArrayList<>();
    private final List<Molfile> products  = new ArrayList<>();
    private final List<Molfile> agents    = new ArrayList<>();
    private boolean numAgents;

    public Rxnfile(String title, String header, String remark)
    {
      this.title = title;
      this.header = header;
      this.remark = remark;
    }

    public String getHeader()
    {
      return header;
    }

    public String getRemark()
    {
      return remark;
    }

    public void setTitle(String title)
    {
      this.title = title;
    }

    public void setHeader(String header)
    {
      this.header = header;
    }

    public void setRemark(String remark)
    {
      this.remark = remark;
    }

    public void addReactant(Molfile molfile)
    {
      reactants.add(molfile);
    }

    public void addProduct(Molfile molfile)
    {
      products.add(molfile);
    }

    public void addAgent(Molfile molfile)
    {
      agents.add(molfile);
    }

    @Override
    public String toString()
    {
      return reactants + " reactants, " + products + " products, " + agents + " agents";
    }

    public String getTitle()
    {
      return title;
    }

    public Iterable<Molfile> reactants()
    {
      return reactants;
    }

    public Iterable<Molfile> products()
    {
      return products;
    }

    public Iterable<Molfile> agents()
    {
      return agents;
    }

    public int getNumReactants()
    {
      return reactants.size();
    }

    public int getNumProducts()
    {
      return products.size();
    }

    public int getNumAgents()
    {
      return agents.size();
    }
  }
}
