/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package rsclient.market;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import logic.ZybezItemListing;
import logic.ZybezOffer;
import net.miginfocom.swing.MigLayout;
import org.pushingpixels.trident.Timeline;

/**
 *
 * @author ben
 */
public class ItemResultPanel extends JPanel implements MouseListener {

    private JLabel itemNameLabel, itemPriceLabel, itemPictureLabel;
    private ItemListingRolloverListener rolloverListener;
    private ArrayList<ZybezOffer> offerList = new ArrayList();
    private final ImageIcon emptyItem = new ImageIcon(getClass().getClassLoader().getResource("resources/emptyitem.png"));
    private Timeline rolloverTimeline;

    public ItemResultPanel() {
        setup();
        setupAnimation();
    }

    public void setup() {
        setLayout(new MigLayout("ins 0"));
        setBackground(Color.darkGray);

        setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));

        itemNameLabel = new JLabel("--");

        //this prevents several item names from stretching too large
        itemNameLabel.setMaximumSize(new Dimension(160, 50));

        itemPriceLabel = new JLabel("--");

        itemPictureLabel = new JLabel(emptyItem);
        itemPictureLabel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));

        itemNameLabel.setForeground(Color.white);
        itemPriceLabel.setForeground(Color.white);

        addMouseListener(this);

        add(itemPictureLabel, "cell 0 0, width 20, height 20, dock west,");
        add(itemNameLabel, "cell 1 0");
        add(itemPriceLabel, "cell 1 1");
    }

    public void clearContents() {

        itemNameLabel.setText("--");
        itemPriceLabel.setText("--");
        itemPictureLabel.setIcon(emptyItem);
        offerList.clear();
    }

    private ImageIcon getItemPicture(ZybezItemListing z) throws IOException {

        URL url = new URL(z.getImageURL());

        url = new URL(z.getImageURL());
        URLConnection urlConnection = url.openConnection();
        urlConnection.addRequestProperty("User-Agent", "Mozilla/5.0");

        BufferedInputStream in = new BufferedInputStream(urlConnection.getInputStream());
        BufferedImage i = ImageIO.read(in);

        ImageIcon o = new ImageIcon(i);

        return o;

    }

    public void setDetails(ZybezItemListing z) {
        itemNameLabel.setText(z.getItemName());
        double doublePrice = Double.parseDouble(z.getAveragePrice());
        String formattedPrice = NumberFormat.getIntegerInstance().format((int) doublePrice);
        itemPriceLabel.setText(formattedPrice.toString()+ " gp");
        try {
            ImageIcon ii = getItemPicture(z);
            itemPictureLabel.setIcon(ii);
        } catch (IOException ex) {
            Logger.getLogger(ItemResultPanel.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void setOffers(ArrayList<ZybezOffer> o) {
        offerList = o;
    }

    public ArrayList<ZybezOffer> getOffers() {
        return offerList;
    }

    public void setRolloverListener(ItemListingRolloverListener rolloverListener) {
        this.rolloverListener = rolloverListener;
    }

    @Override
    public void mouseClicked(MouseEvent me) {
        if (rolloverListener != null) {
            rolloverListener.onClicked(this);
        }
    }

    @Override
    public void mousePressed(MouseEvent me) {}

    @Override
    public void mouseReleased(MouseEvent me) {}

    @Override
    public void mouseEntered(MouseEvent me) {
        if (rolloverListener != null) {
            rolloverTimeline.play();
        }
    }

    @Override
    public void mouseExited(MouseEvent me) {
        if (rolloverListener != null) {
            rolloverTimeline.playReverse();
        }
    }

    private void setupAnimation() {
        rolloverTimeline = new Timeline(this);
        rolloverTimeline.addPropertyToInterpolate("background", this.getBackground(), new Color(91, 91, 91));
        rolloverTimeline.setDuration(150);
    }

    public void selectPanel() {
        this.setBackground(new Color(91, 91, 91));
        rolloverTimeline.addPropertyToInterpolate("background", this.getBackground(), new Color(91, 91, 91));
    }

    public void deselectPanel() {
        this.setBackground(new Color(64, 64, 64));
        rolloverTimeline.addPropertyToInterpolate("background", this.getBackground(), new Color(91, 91, 91));
    }

}