/* ====================================================================
   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.poi.hssf.usermodel;

import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.record.HyperlinkRecord;
import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.util.Internal;

/**
 * Represents an Excel hyperlink.
 */
public class HSSFHyperlink implements Hyperlink {

    /**
     * Low-level record object that stores the actual hyperlink data
     */
    final protected HyperlinkRecord record;

    /**
     * If we create a new hyperlink remember its type
     */
    final protected HyperlinkType link_type;

    /**
     * Construct a new hyperlink
     * 
     * This method is internal to be used only by
     * {@link HSSFCreationHelper#createHyperlink(int)}.
     *
     * @param type the type of hyperlink to create
     * @deprecated POI 3.15 beta 3
     */
    @Internal(since="3.15 beta 3")
    protected HSSFHyperlink( int type )
    {
        this(HyperlinkType.forInt(type));
    }
    
    /**
     * Construct a new hyperlink
     * 
     * This method is internal to be used only by
     * {@link HSSFCreationHelper#createHyperlink(HyperlinkType)}.
     *
     * @param type the type of hyperlink to create
     */
    @Internal(since="3.15 beta 3")
    protected HSSFHyperlink( HyperlinkType type )
    {
        this.link_type = type;
        record = new HyperlinkRecord();
        switch(type){
            case URL:
            case EMAIL:
                record.newUrlLink();
                break;
            case FILE:
                record.newFileLink();
                break;
            case DOCUMENT:
                record.newDocumentLink();
                break;
            default:
                throw new IllegalArgumentException("Invalid type: " + type);
        }
    }

    /**
     * Initialize the hyperlink by a <code>HyperlinkRecord</code> record
     *
     * @param record
     */
    protected HSSFHyperlink( HyperlinkRecord record )
    {
        this.record = record;
        link_type = getType(record);
    }
    
    private static HyperlinkType getType(HyperlinkRecord record) {
        HyperlinkType link_type;
        // Figure out the type
        if (record.isFileLink()) {
            link_type = HyperlinkType.FILE;
        } else if(record.isDocumentLink()) {
            link_type = HyperlinkType.DOCUMENT;
        } else {
            if(record.getAddress() != null &&
                    record.getAddress().startsWith("mailto:")) {
                link_type = HyperlinkType.EMAIL;
            } else {
                link_type = HyperlinkType.URL;
            }
        }
        return link_type;
    }
    
    protected HSSFHyperlink(Hyperlink other) {
        if (other instanceof HSSFHyperlink) {
            HSSFHyperlink hlink = (HSSFHyperlink) other;
            record = hlink.record.clone();
            link_type = getType(record);
        }
        else {
            link_type = other.getTypeEnum();
            record = new HyperlinkRecord();
            setFirstRow(other.getFirstRow());
            setFirstColumn(other.getFirstColumn());
            setLastRow(other.getLastRow());
            setLastColumn(other.getLastColumn());
        }
    }

    /**
     * Return the row of the first cell that contains the hyperlink
     *
     * @return the 0-based row of the cell that contains the hyperlink
     */
    @Override
    public int getFirstRow(){
        return record.getFirstRow();
    }

    /**
     * Set the row of the first cell that contains the hyperlink
     *
     * @param row the 0-based row of the first cell that contains the hyperlink
     */
    @Override
    public void setFirstRow(int row){
        record.setFirstRow(row);
    }

    /**
     * Return the row of the last cell that contains the hyperlink
     *
     * @return the 0-based row of the last cell that contains the hyperlink
     */
    @Override
    public int getLastRow(){
        return record.getLastRow();
    }

    /**
     * Set the row of the last cell that contains the hyperlink
     *
     * @param row the 0-based row of the last cell that contains the hyperlink
     */
    @Override
    public void setLastRow(int row){
        record.setLastRow(row);
    }

    /**
     * Return the column of the first cell that contains the hyperlink
     *
     * @return the 0-based column of the first cell that contains the hyperlink
     */
    @Override
    public int getFirstColumn(){
        return record.getFirstColumn();
    }

    /**
     * Set the column of the first cell that contains the hyperlink
     *
     * @param col the 0-based column of the first cell that contains the hyperlink
     */
    @Override
    public void setFirstColumn(int col){
        record.setFirstColumn((short)col);
    }

    /**
     * Return the column of the last cell that contains the hyperlink
     *
     * @return the 0-based column of the last cell that contains the hyperlink
     */
    @Override
    public int getLastColumn(){
        return record.getLastColumn();
    }

    /**
     * Set the column of the last cell that contains the hyperlink
     *
     * @param col the 0-based column of the last cell that contains the hyperlink
     */
    @Override
    public void setLastColumn(int col){
        record.setLastColumn((short)col);
    }

    /**
     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
     *
     * @return  the address of this hyperlink
     */
    @Override
    public String getAddress(){
        return record.getAddress();
    }
    public String getTextMark(){
        return record.getTextMark();
    }

    /**
     * Convenience method equivalent to {@link #setAddress(String)}
     *
     * @param textMark the place in worksheet this hyperlink refers to, e.g. 'Target Sheet'!A1'
     */
    public void setTextMark(String textMark) {
        record.setTextMark(textMark);
    }
    public String getShortFilename(){
        return record.getShortFilename();
    }
    /**
     * Convenience method equivalent to {@link #setAddress(String)}
     *
     * @param shortFilename the path to a file this hyperlink points to, e.g. 'readme.txt'
     */
    public void setShortFilename(String shortFilename) {
        record.setShortFilename(shortFilename);
    }

    /**
     * Hyperlink address. Depending on the hyperlink type it can be URL, e-mail, path to a file, etc.
     *
     * @param address  the address of this hyperlink
     */
    @Override
    public void setAddress(String address){
        record.setAddress(address);
    }

    /**
     * Return text label for this hyperlink
     *
     * @return  text to display
     */
    @Override
    public String getLabel(){
        return record.getLabel();
    }

    /**
     * Sets text label for this hyperlink
     *
     * @param label text label for this hyperlink
     */
    @Override
    public void setLabel(String label){
        record.setLabel(label);
    }

    /**
     * Return the type of this hyperlink
     *
     * @return the type of this hyperlink
     * @see HyperlinkType#forInt
     * @deprecated POI 3.15. Use {@link #getTypeEnum()} instead.
     * getType will return a HyperlinkType enum in the future.
     */
    @Override
    public int getType() {
        return link_type.getCode();
    }
    
    /**
     * Return the type of this hyperlink
     *
     * @return the type of this hyperlink
     */
    @Override
    public HyperlinkType getTypeEnum() {
        return link_type;
    }
    
    /**
     * @return whether the objects have the same HyperlinkRecord
     */
    @Override
    public boolean equals(Object other) {
        if (this == other) return true;
        if (!(other instanceof HSSFHyperlink)) return false;
        HSSFHyperlink otherLink = (HSSFHyperlink) other;
        return record == otherLink.record;
    }
    
    @Override
    public int hashCode() {
        return record.hashCode();
    }
}
