// Carnegie Mellon University
//   Information Networking Institute and
//   School of Computer Science
//
// Master Thesis: A Monitoring Tool for Overlay Network
// By: TungFai Chan and Annie Cheng
//
// File: Page.java
// Path: eventbase/virtualMemory
// Description: Defines a page in disk/virtual memory

package eventbase.virtualMemory;

import java.io.*;

public class Page {

    final static int NUM_RECORD_PER_PAGE = VirtualMemory.RECORDSPERPAGE;

    Record[] recordsList = null;
    private int pageID = -1;
    boolean dirty = false;
    private int rec_count;

    public Page(int id) {
        recordsList = new Record[NUM_RECORD_PER_PAGE];
        for (int i = 0; i < NUM_RECORD_PER_PAGE; i++)
            recordsList[i] = new Record(i);
        pageID = id;
        rec_count = 0;
    }

    // should only be used by disk !!
    public Page(int id, byte[] buffer) throws IOException {
        ByteArrayInputStream byteArray = new ByteArrayInputStream(buffer);
        recordsList = new Record[NUM_RECORD_PER_PAGE];
        for (int i = 0; i < NUM_RECORD_PER_PAGE; i++) {
            byte[] buf = new byte[Record.MAX_LENGTH];
            byteArray.read(buf);
            recordsList[i] = new Record(i, buf);
            rec_count++;
        }
        pageID = id;
    }

    public void insertRecordIntoPage(Record rec) {
        recordsList[rec.getRecordID()] = rec;
        dirty = true;
        rec_count++;
    }

    public Record getRecordFromPage(int index) {
        return recordsList[index];
    }

    public boolean isDirty() {
        return dirty;
    }

    public byte[] getBytes() throws IOException {
        /*
        byte[] buffer = new byte[NUM_RECORD_PER_PAGE * Record.MAX_LENGTH];
        for (int i = 0; i < NUM_RECORD_PER_PAGE; i++) {
            byte[] tmpBuf = recordsList[i].getBytes();
            for (int j = 0; j < Record.MAX_LENGTH; j++)
                buffer[i * Record.MAX_LENGTH + j] = tmpBuf[j];
        }

        return buffer;
        */
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        for (int i = 0; i < NUM_RECORD_PER_PAGE; i++)
            byteArray.write(recordsList[i].getBytes());

        return byteArray.toByteArray();
    }

    public int getPageID() {
        return pageID;
    }

    public void setPageID(int id) {
        pageID = id;
    }

    public boolean isFull() {
      return (rec_count >= this.NUM_RECORD_PER_PAGE);
    }

    public int getNextRecordID() {
      int retVal = rec_count;
      if (!isFull()) {
        return retVal;
      }
      return -1;
    }

    public void printPageContent() {
      System.out.println("Page: " + pageID);
      for (int i = 0; i < this.rec_count; i++) {
        this.getRecordFromPage(i).printRecord();
      }
    }

}