/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.jasper.compiler;

import java.net.MalformedURLException;
import java.net.URL;

import org.apache.jasper.JspCompilationContext;

/**
 * Mark represents a point in the JSP input.
 */
public final class Mark {

    // position within current stream
    int cursor, line, col;

    // current stream
    char[] stream = null;

    // name of the current file
    private String fileName;

    private JspCompilationContext ctxt;

    /**
     * Constructor
     *
     * @param reader   JspReader this mark belongs to
     * @param inStream current stream for this mark
     * @param name     JSP file name
     */
    Mark(JspReader reader, char[] inStream, String name) {
        this.ctxt = reader.getJspCompilationContext();
        this.stream = inStream;
        this.cursor = 0;
        this.line = 1;
        this.col = 1;
        this.fileName = name;
    }


    /**
     * Constructor
     */
    Mark(Mark other) {
        init(other, false);
    }

    void update(int cursor, int line, int col) {
        this.cursor = cursor;
        this.line = line;
        this.col = col;
    }

    void init(Mark other, boolean singleFile) {
        this.cursor = other.cursor;
        this.line = other.line;
        this.col = other.col;

        if (!singleFile) {
            this.ctxt = other.ctxt;
            this.stream = other.stream;
            this.fileName = other.fileName;
        }
    }


    /**
     * Constructor
     */
    Mark(JspCompilationContext ctxt, String filename, int line, int col) {
        this.ctxt = ctxt;
        this.stream = null;
        this.cursor = 0;
        this.line = line;
        this.col = col;
        this.fileName = filename;
    }


    /**
     * Get the line number.
     *
     * @return the line number
     */
    public int getLineNumber() {
        return line;
    }

    /**
     * Get the column number.
     *
     * @return the column number
     */
    public int getColumnNumber() {
        return col;
    }

    @Override
    public String toString() {
        return getFile() + "(" + line + "," + col + ")";
    }

    /**
     * Get the file name.
     *
     * @return the file name
     */
    public String getFile() {
        return this.fileName;
    }

    /**
     * Gets the URL of the resource with which this Mark is associated
     *
     * @return URL of the resource with which this Mark is associated
     *
     * @exception MalformedURLException if the resource pathname is incorrect
     */
    public URL getURL() throws MalformedURLException {
        return ctxt.getResource(getFile());
    }

    @Override
    public boolean equals(Object other) {
        if (other instanceof Mark m) {
            return this.cursor == m.cursor && this.line == m.line && this.col == m.col;
        }
        return false;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + col;
        result = prime * result + cursor;
        result = prime * result + line;
        return result;
    }
}
