package org.ebookdroid.core;

import org.ebookdroid.common.settings.books.BookSettings;
import org.ebookdroid.core.models.DocumentModel;

import org.json.JSONException;
import org.json.JSONObject;

public class PageIndex {

    public static final PageIndex NULL = new PageIndex(-1, -1);

    public static final PageIndex FIRST = new PageIndex(0, 0);

    public static final PageIndex LAST = new PageIndex(Integer.MAX_VALUE, Integer.MAX_VALUE);

    public final int docIndex;
    public final int viewIndex;

    public PageIndex(final int docIndex, final int viewIndex) {
        this.docIndex = docIndex;
        this.viewIndex = viewIndex;
    }

    public PageIndex(final JSONObject jsonObject) throws JSONException {
        this.docIndex = jsonObject.getInt("docIndex");
        this.viewIndex = jsonObject.getInt("viewIndex");
    }

    public JSONObject toJSON() throws JSONException {
        final JSONObject obj = new JSONObject();
        obj.put("docIndex", docIndex);
        obj.put("viewIndex", viewIndex);
        return obj;
    }

    public Page getActualPage(final DocumentModel dm, final BookSettings bs) {
        if (this == FIRST) {
            return dm.getPageObject(0);
        }
        if (this == LAST) {
            return dm.getLastPageObject();
        }
        // If now page splitting is switched off:
        // The document index is valid in all cases
        if (!bs.splitPages) {
            return dm.getPageObject(viewIndex);
        }
        // If now page splitting is switched on and bookmark was created in splitting mode (page.docIndex !=
        // page.viewIndex)
        // The view index is valid
        if (docIndex != viewIndex) {
            return dm.getPageObject(viewIndex);
        }

        // If now page splitting is switched on and bookmark was created in non-splitting mode (page.docIndex !=
        // page.viewIndex)
        for (final Page p : dm.getPages()) {
            if (p.index.docIndex == docIndex) {
                return p;
            }
        }

        return null;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + docIndex;
        result = prime * result + viewIndex;
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PageIndex other = (PageIndex) obj;
        if (docIndex != other.docIndex) {
            return false;
        }
        if (viewIndex != other.viewIndex) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "[" + docIndex + ":" + viewIndex + "]";
    }
}
