package com.jdbernard.teammaker

import java.awt.BorderLayout
import java.awt.Color
import java.awt.Component
import javax.swing.JLabel
import javax.swing.JList
import javax.swing.JPanel
import javax.swing.ListCellRenderer
import javax.swing.BorderFactory

public class PlayerListCellRenderer extends JPanel implements ListCellRenderer {

    boolean showStats
    boolean colored

    private TeamMaker teamMaker

    private JLabel nameLabel
    private JLabel statsLabel
    
    private static def linedBorder = BorderFactory.createLineBorder(Color.BLACK)
    private static def emptyBorder = BorderFactory.createEmptyBorder()

    private def colors = [Color.getHSBColor(0.32f, 1f, 1f),
        Color.getHSBColor(0.24f,1f,1f), Color.getHSBColor(0.16f, 1f, 1f),
        Color.getHSBColor(0.08f, 1f, 1f), Color.getHSBColor(0.0f, 1f, 1f)]

    public PlayerListCellRenderer(Map params, def tm) {
        teamMaker = tm
        showStats = params.showStats ?: false
        colored = params.colored ?: false

        setLayout(new BorderLayout())
        setOpaque(colored)

        nameLabel = new JLabel()
        nameLabel.opaque = false
        nameLabel.horizontalAlignment = JLabel.LEADING
        add(nameLabel, BorderLayout.WEST)

        if (showStats) {
            statsLabel = new JLabel()
            statsLabel.horizontalAlignment = JLabel.TRAILING
            statsLabel.opaque = false
            add(statsLabel, BorderLayout.EAST)
        }
    }

    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {

        assert value instanceof Player

        nameLabel.setText(value.name)

        if (isSelected) setBorder(linedBorder)
        else setBorder(emptyBorder)
        
        if (showStats) {
            int odds = Math.round(teamMaker.playerChooser.calculateOdds(
                list.model, teamMaker.spotsOpen, value) * 100)
            statsLabel.text = "${value.gamesSat} (${odds}%)"
        }

        if (colored) {
            def c = colors[Math.min(4, value.gamesSat)]
            setBackground(c)
        }

        return this
    }

}
