// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.suggestions.tile;

import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;

import androidx.annotation.Nullable;

import org.chromium.chrome.browser.suggestions.OfflinableSuggestion;
import org.chromium.chrome.browser.suggestions.SiteSuggestion;
import org.chromium.components.favicon.IconType;
import org.chromium.url.GURL;

/**
 * Holds the details to populate a site suggestion tile.
 */
public class Tile implements OfflinableSuggestion {
    private final SiteSuggestion mSiteData;

    private final int mIndex;

    private @TileVisualType int mType = TileVisualType.NONE;

    private @IconType int mIconType = IconType.INVALID;

    @Nullable
    private Drawable mIcon;

    @Nullable
    private ColorStateList mIconTint;

    @Nullable
    private Long mOfflinePageOfflineId;

    /**
     * @param suggestion The site data we want to populate the tile with.
     * @param index The index of this tile in the list of tiles.
     */
    public Tile(SiteSuggestion suggestion, int index) {
        mSiteData = suggestion;
        mIndex = index;
    }

    public SiteSuggestion getData() {
        return mSiteData;
    }

    @Override
    public GURL getUrl() {
        return mSiteData.url;
    }

    @Override
    public void setOfflinePageOfflineId(@Nullable Long offlineId) {
        mOfflinePageOfflineId = offlineId;
    }

    @Nullable
    @Override
    public Long getOfflinePageOfflineId() {
        return mOfflinePageOfflineId;
    }

    @Override
    public boolean requiresExactOfflinePage() {
        return false;
    }

    /**
     * @return The title of this tile.
     */
    public String getTitle() {
        return mSiteData.title;
    }

    /**
     * @return Whether this tile is available offline.
     */
    public boolean isOfflineAvailable() {
        return getOfflinePageOfflineId() != null;
    }

    /**
     * @return The index of this tile in the list of tiles.
     */
    public int getIndex() {
        return mIndex;
    }

    /**
     * @return The source of this tile's title. Used for metrics tracking. Valid values are listed
     * in {@code TileTitleSource}.
     */
    public @TileTitleSource int getTitleSource() {
        return mSiteData.titleSource;
    }

    /**
     * @return The source of this tile. Used for metrics tracking. Valid values are listed in
     * {@code TileSource}.
     */
    public @TileSource int getSource() {
        return mSiteData.source;
    }

    /**
     * @return The visual type of this tile. Valid values are listed in {@link TileVisualType}.
     */
    public @TileVisualType int getType() {
        return mType;
    }

    /**
     * Sets the visual type of this tile. Valid values are listed in
     * {@link TileVisualType}.
     */
    public void setType(@TileVisualType int type) {
        mType = type;
    }

    /**
     * @return The icon type of this tile. Valid values are listed in {@link IconType}.
     */
    public @IconType int getIconType() {
        return mIconType;
    }

    /**
     * Sets the icon type of this tile. Valid values are listed in {@link IconType}.
     */
    public void setIconType(@IconType int iconType) {
        mIconType = iconType;
    }

    /**
     * @return The icon, may be null.
     */
    public @Nullable Drawable getIcon() {
        return mIcon;
    }

    /**
     * Updates the icon drawable.
     */
    public void setIcon(@Nullable Drawable icon) {
        mIcon = icon;
    }

    /**
     * Updates the icon tint color.
     */
    public void setIconTint(@Nullable ColorStateList iconTint) {
        mIconTint = iconTint;
    }

    public ColorStateList getIconTint() {
        return mIconTint;
    }

    public @TileSectionType int getSectionType() {
        return mSiteData.sectionType;
    }
}
