package com.trabauer.twitchtools.model;

import com.trabauer.twitchtools.model.twitch.TwitchVideoInfo;

import javax.swing.*;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import java.util.*;

/**
 * Created by Flo on 19.11.2014.
 */
public class FilenamePatternsComboBoxModel implements MutableComboBoxModel<String>, Observer {

    private HashSet<ListDataListener> listDataListeners;
    private ArrayList<String> filenamePatterns;
    private int selectedItemIndex = 0;



    public FilenamePatternsComboBoxModel() {
        super();
        this.filenamePatterns = new ArrayList<String>();
        this.listDataListeners = new HashSet<ListDataListener>();
    }

    public FilenamePatternsComboBoxModel(ArrayList<String> filenamePatterns) {
        this();
        this.filenamePatterns = new ArrayList<String>(filenamePatterns);
    }

    public FilenamePatternsComboBoxModel(String[] keys) {
        this();
    }

    @Override
    public void setSelectedItem(Object anItem) {
        if(filenamePatterns.contains(anItem)) {
            selectedItemIndex = filenamePatterns.indexOf(anItem);
            notifyListDataListeners();
        }
    }

    @Override
    public String getSelectedItem() {
        return filenamePatterns.get(selectedItemIndex);
    }

    @Override
    public int getSize() {
        return filenamePatterns.size();
    }

    @Override
    public String getElementAt(int index) {
        return filenamePatterns.get(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        listDataListeners.add(l);
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        listDataListeners.remove(l);
    }

    @Override
    public void addElement(String pattern) {
        if(pattern != null) {
            filenamePatterns.add(pattern);
            notifyListDataListeners();
        }
    }

    public void addElement(String pattern, int index) {
        if(pattern != null) {
            filenamePatterns.add(index, pattern);
            notifyListDataListeners();
        }
    }

    @Override
    public void update(Observable o, Object arg) {
        //STUB
        if(o.getClass().equals(TwitchVideoInfo.class)) { //Observed TwichVideo changed update Observers
            //TwitchVideo twitchVideo = (TwitchVideo)o;
            //this.filenamePatterns = new ArrayList<String>();
        }
    }



    @Override
    public void removeElement(Object obj) {
        filenamePatterns.remove(obj);
        notifyListDataListeners();
    }

    @Override
    public void insertElementAt(String item, int index) {
        filenamePatterns.add(index, item);
        notifyListDataListeners();
    }

    @Override
    public void removeElementAt(int index) {
        filenamePatterns.remove(index);
        notifyListDataListeners();
    }

    public boolean containsElement(String item) {
        return filenamePatterns.contains(item);
    }

    private void notifyListDataListeners() {
        for(ListDataListener listener: listDataListeners) {
            listener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize()-1));
        }
    }
}