/*
 * MediathekView
 * Copyright (C) 2008 W. Xaver
 * W.Xaver[at]googlemail.com
 * http://zdfmediathk.sourceforge.net/
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package mediathek.gui;

import com.jidesoft.utils.SystemInfo;
import mSearch.Const;
import mSearch.daten.DatenFilm;
import mSearch.daten.ListeFilme;
import mSearch.filmlisten.FilmlisteLesen;
import mSearch.tool.Duration;
import mSearch.tool.Functions;
import mSearch.tool.Listener;
import mSearch.tool.Log;
import mediathek.config.Daten;
import mediathek.config.MVConfig;
import mediathek.gui.dialogEinstellungen.PanelFilmlisten;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Iterator;

@SuppressWarnings("serial")
public class GuiDebug extends JPanel {

    private final JButton[] buttonSender;
    private final String[] sender;
    private final Daten daten;

    public GuiDebug(Daten d) {
        super();
        initComponents();
        daten = d;
        sender = daten.getFilmeLaden().getSenderNamen();
        buttonSender = new JButton[sender.length];

        jPanelFilmlisteLaden.setLayout(new GridLayout(1, 1));
        jPanelFilmlisteLaden.add(new PanelFilmlisten(d, daten.getMediathekGui()));

        jPanelStarts.setLayout(new GridLayout(1, 1));
        jPanelStarts.add(new PanelInfoStarts());

        //Tab1 Sender löschen Panel füllen
        for (int i = 0; i < daten.getFilmeLaden().getSenderNamen().length; ++i) {
            buttonSender[i] = new JButton(sender[i]);
            buttonSender[i].addActionListener(new BeobSenderLoeschen(sender[i]));
        }
        addSender();
        jButtonNeuLaden.addActionListener(ae
                -> {
            daten.getListeFilme().clear();
            Duration.staticPing("Start");
            new FilmlisteLesen().readFilmListe(Daten.getDateiFilmliste(), daten.getListeFilme(), Integer.parseInt(MVConfig.get(MVConfig.Configs.SYSTEM_ANZ_TAGE_FILMLISTE)));
            Duration.staticPing("Fertig");
            daten.getListeFilme().themenLaden();
            daten.getListeAbo().setAboFuerFilm(daten.getListeFilme(), false /*aboLoeschen*/);
            daten.getListeBlacklist().filterListe();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
        });
        jButtonAllesSpeichern.addActionListener(e
                -> {
            daten.allesSpeichern();
            daten.filmlisteSpeichern();
        });
        jButtonFilmlisteLoeschen.addActionListener(e
                -> {
            daten.getListeFilme().clear();
            daten.getListeBlacklist().filterListe();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
        });
        jButtonFehler.addActionListener(e -> Log.endMsg());
        jButtonCheck.addActionListener(e -> daten.getListeFilme().check());

        jButtonClean.addActionListener(ae -> cleanList());
        btnPathDiff.addActionListener(new BeobPfad());
        btnDiff.addActionListener((ActionEvent e)
                -> {
            ListeFilme listeFilme = new ListeFilme();
            final HashSet<String> hash = new HashSet<>(listeFilme.size() + 1, 1);
            new FilmlisteLesen().readFilmListe(txtDiff.getText(), listeFilme, 0);

            // ==========================================
            for (DatenFilm f : listeFilme) {
                if (f.arr[DatenFilm.FILM_SENDER].equals(Const.KIKA)) {
                    // beim KIKA ändern sich die URLs laufend
                    hash.add(f.arr[DatenFilm.FILM_THEMA] + f.arr[DatenFilm.FILM_TITEL]);
                } else if (!cbkUrl.isSelected()) {
                    hash.add(f.getIndex());
                } else {
                    hash.add(DatenFilm.getUrl(f));
                }
            }

            System.out.println("---------------------");
            System.out.println("vorher: " + daten.getListeFilme().size());

            Iterator<DatenFilm> it = daten.getListeFilme().iterator();
            while (it.hasNext()) {
                DatenFilm f = it.next();
                if (f.arr[DatenFilm.FILM_SENDER].equals(Const.KIKA)) {
                    // beim KIKA ändern sich die URLs laufend
                    if (hash.contains(f.arr[DatenFilm.FILM_THEMA] + f.arr[DatenFilm.FILM_TITEL])) {
                        it.remove();
                    }
                } else if (!cbkUrl.isSelected()) {
                    if (hash.contains(f.getIndex())) {
                        it.remove();
                    }
                } else if (hash.contains(DatenFilm.getUrl(f))) {
                    it.remove();
                }
            }

            System.out.println("danach: " + daten.getListeFilme().size());
            daten.filmlisteSpeichern();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
            hash.clear();
        });

        addComponentListener(new java.awt.event.ComponentAdapter() {
            @Override
            public void componentShown(java.awt.event.ComponentEvent evt) {
                //                daten.getMediathekGui().setTabShown(MediathekGui.TABS.TAB_NIX);
                daten.getMediathekGui().getStatusBar().setIndexForLeftDisplay(MVStatusBar.StatusbarIndex.NONE);
            }
        });

        btnDelDoppelteUrls.addActionListener(e
                -> {
            System.out.println("---------------------");
            System.out.println("vorher: " + daten.getListeFilme().size());

            ListeFilme listeFilme = new ListeFilme();
            HashSet<String> hash = new HashSet<>();
            daten.getListeFilme().stream().filter(film -> !hash.contains(film.arr[DatenFilm.FILM_URL]))
                    .forEach(film
                            -> {
                        hash.add(film.arr[DatenFilm.FILM_URL]);
                        listeFilme.add(film);
                    });
            hash.clear();
            // ==========================================
            daten.setListeFilme(listeFilme);
            System.out.println("danach: " + daten.getListeFilme().size());
            daten.filmlisteSpeichern();
        });
        btnNurDoppelte.addActionListener(e
                -> {
            ListeFilme listeFilme = new ListeFilme();
            HashSet<String> hash = new HashSet<>();
            HashSet<String> hashDoppelt = new HashSet<>();
            for (DatenFilm film : daten.getListeFilme()) {
                if (hash.contains(film.arr[DatenFilm.FILM_URL])) {
                    hashDoppelt.add(film.arr[DatenFilm.FILM_URL]);
                } else {
                    hash.add(film.arr[DatenFilm.FILM_URL]);
                }
            }
            hash.clear();
            for (DatenFilm film : daten.getListeFilme()) {
                if (hashDoppelt.contains(film.arr[DatenFilm.FILM_URL])) {
                    listeFilme.add(film);
                }
            }
            hashDoppelt.clear();
            saveNewListeFilme(listeFilme);
        });
        jButtonHashOlddoppelt.addActionListener(e
                -> {
            ListeFilme listeFilme = new ListeFilme();
            HashSet<String> hash = new HashSet<>();
            HashSet<String> hashDoppelt = new HashSet<>();
            for (DatenFilm film : daten.getListeFilme()) {
                String tt = film.getIndexAddOld();
                if (hash.contains(tt)) {
                    hashDoppelt.add(tt);
                } else {
                    hash.add(tt);
                }
            }
            hash.clear();
            for (DatenFilm film : daten.getListeFilme()) {
                String tt = film.getIndexAddOld();
                if (hashDoppelt.contains(tt)) {
                    listeFilme.add(film);
                }
            }
            hashDoppelt.clear();
            saveNewListeFilme(listeFilme);
        });
        jButtonTTUrl.addActionListener(e
                -> {
            ListeFilme listeFilme = new ListeFilme();
            HashSet<String> hash = new HashSet<>();
            HashSet<String> hashDoppelt = new HashSet<>();
            for (DatenFilm film : daten.getListeFilme()) {
                String tt = film.arr[DatenFilm.FILM_THEMA].toLowerCase() + film.arr[DatenFilm.FILM_TITEL].toLowerCase() + film.arr[DatenFilm.FILM_URL];
                if (hash.contains(tt)) {
                    hashDoppelt.add(tt);
                } else {
                    hash.add(tt);
                }
            }
            hash.clear();
            for (DatenFilm film : daten.getListeFilme()) {
                String tt = film.arr[DatenFilm.FILM_THEMA].toLowerCase() + film.arr[DatenFilm.FILM_TITEL].toLowerCase() + film.arr[DatenFilm.FILM_URL];
                if (hashDoppelt.contains(tt)) {
                    listeFilme.add(film);
                }
            }
            hashDoppelt.clear();
            saveNewListeFilme(listeFilme);
        });
        jButtonOldList.addActionListener(new BeobPfadOldUrl());
        //FIXME unten auskommentierten Block an mSearch anpassen wenn stable...
        //bis dahin bleibt der Button erst mal disabled.
        jButtonAddOld.setEnabled(false);
//        jButtonAddOld.addActionListener((ActionEvent e) ->
//        {
//            String url = jTextFieldOld.getText();
//            ListeFilme listeEinsortieren = new ListeFilme();
//            new FilmlisteLesen().readFilmListe(url, listeEinsortieren, 0 /*all days*/);
//
//            HashSet<String> hash = new HashSet<>(listeEinsortieren.size() + 1, 1);
//            HashSet<String> hash2 = new HashSet<>(listeEinsortieren.size() + 1, 1);
//
//            // ==============================================
//            // nach "Thema-Titel" suchen
//            daten.getListeFilme().forEach((f) -> hash.add(f.getIndexAddOld_()));
//            listeEinsortieren.removeIf((f) -> hash.contains(f.getIndexAddOld_()));
//            DbgMsg.print("Anzahl Filme: " + daten.getListeFilme().size());
//
//            hash.clear();
//            ListeFilme lf = new ListeFilme();
//            listeEinsortieren.forEach((f) ->
//            {
//                if (hash2.contains(f.getIndexAddOld())) {
//                    lf.add(f);
//                } else {
//                    hash2.add(f.getIndexAddOld());
//                }
//            });
//            daten.setListeFilme(lf);
//            hash.clear();
//            DbgMsg.print("Anzahl Filme: " + daten.getListeFilme().size());
//
//            daten.getListeFilme().sort();
//            daten.getListeBlacklist().filterListe();
//            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
//        });
        jButtonLiveStreams.addActionListener(e
                -> {
            String url = jTextFieldLiveStreams.getText();
            ListeFilme tmpListe = new ListeFilme();
            new FilmlisteLesen().readFilmListe(url, tmpListe, 0 /*all days*/);
            addLive(tmpListe);
            tmpListe.clear();
            System.gc();
            daten.getListeFilme().sort();
            daten.getListeBlacklist().filterListe();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
        });
        jButtonDelLive.addActionListener(e
                -> {
            daten.getListeFilme().removeIf(f -> f.arr[DatenFilm.FILM_THEMA].equals(ListeFilme.THEMA_LIVE));
            daten.getListeBlacklist().filterListe();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
        });
    }

    public synchronized void addLive(ListeFilme listeEinsortieren) {
        // live-streams einfügen, es werde die vorhandenen ersetzt!

        if (listeEinsortieren.size() <= 0) {
            //dann wars wohl nix
            return;
        }

        daten.getListeFilme().removeIf(f -> f.arr[DatenFilm.FILM_THEMA].equals(ListeFilme.THEMA_LIVE));
        listeEinsortieren.forEach(daten.getListeFilme()::add);
    }

    private void saveNewListeFilme(final ListeFilme listeFilme) {
        System.out.println("---------------------");
        System.out.println("vorher: " + daten.getListeFilme().size());
        daten.setListeFilme(listeFilme);
        System.out.println("danach: " + daten.getListeFilme().size());
        daten.filmlisteSpeichern();
    }

    private void addSender() {
        jPanelLoeschen.removeAll();
        jPanelLoeschen.setLayout(new GridLayout(0, 5));
        int nr = 0;
        for (String aSender : sender) {
            JButton btn = buttonSender[nr];
            btn.setText(aSender);
            jPanelLoeschen.add(btn);
            ++nr;
        }
        jPanelLoeschen.repaint();
    }

    // clean list
    public void cleanList() {
        int count = 0;
        final String DATUM_ZEIT_FORMAT = "dd.MM.yyyy, HH:mm";
        final SimpleDateFormat sdfClean = new SimpleDateFormat(DATUM_ZEIT_FORMAT);
        Log.sysLog("cleanList start: " + sdfClean.format(System.currentTimeMillis()));

        daten.getListeFilme().forEach(Functions::unescape);
        daten.filmlisteSpeichern();
        Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());

        Log.sysLog("cleanList stop: " + sdfClean.format(System.currentTimeMillis()));
        Log.sysLog("cleanList count: " + count);
    }

//    private void urlTauschen(DatenFilm film, String urlSeite) {
//        // manuell die Auflösung hochsetzen
//
//        //große URL verbessern
//        changeUrl("2256k_p14v11.mp4", "2328k_p35v11.mp4", film, urlSeite);
//        changeUrl("2256k_p14v12.mp4", "2328k_p35v12.mp4", film, urlSeite);
//        changeUrl("2296k_p14v13.mp4", "2328k_p35v13.mp4", film, urlSeite);
//
//        //klein nach groß
//        changeUrl("1456k_p13v11.mp4", "2328k_p35v11.mp4", film, urlSeite);
//        changeUrl("1456k_p13v11.mp4", "2256k_p14v11.mp4", film, urlSeite); //wenns nicht geht, dann vielleicht so
//
//        changeUrl("1456k_p13v12.mp4", "2328k_p35v12.mp4", film, urlSeite);
//        changeUrl("1456k_p13v12.mp4", "2256k_p14v12.mp4", film, urlSeite); //wenns nicht geht, dann vielleicht so
//
//        changeUrl("1496k_p13v13.mp4", "2328k_p35v13.mp4", film, urlSeite);
//        changeUrl("1496k_p13v13.mp4", "2296k_p14v13.mp4", film, urlSeite); //wenns nicht geht, dann vielleicht so
//
//        // manuell die Auflösung für HD setzen, 2 Versuche
//        updateHd("1456k_p13v12.mp4", "3328k_p36v12.mp4", film, urlSeite);
//        updateHd("2256k_p14v12.mp4", "3328k_p36v12.mp4", film, urlSeite);
//        updateHd("2328k_p35v12.mp4", "3328k_p36v12.mp4", film, urlSeite);
//
//        updateHd("1456k_p13v12.mp4", "3256k_p15v12.mp4", film, urlSeite);
//        updateHd("2256k_p14v12.mp4", "3256k_p15v12.mp4", film, urlSeite);
//        updateHd("2328k_p35v12.mp4", "3256k_p15v12.mp4", film, urlSeite);
//
//        updateHd("1496k_p13v13.mp4", "3296k_p15v13.mp4", film, urlSeite);
//        updateHd("2296k_p14v13.mp4", "3296k_p15v13.mp4", film, urlSeite);
//        updateHd("2328k_p35v13.mp4", "3296k_p15v13.mp4", film, urlSeite);
//
//        updateHd("1496k_p13v13.mp4", "3328k_p36v13.mp4", film, urlSeite);
//        updateHd("2296k_p14v13.mp4", "3328k_p36v13.mp4", film, urlSeite);
//        updateHd("2328k_p35v13.mp4", "3328k_p36v13.mp4", film, urlSeite);
//    }
//
//    private void changeUrl(String from, String to, DatenFilm film, String urlSeite) {
//        if (film.arr[DatenFilm.FILM_URL].endsWith(from)) {
//            String url_ = film.arr[DatenFilm.FILM_URL].substring(0, film.arr[DatenFilm.FILM_URL].lastIndexOf(from)) + to;
//            String l = daten.getListeFilme().getFileSizeUrl(url_, film.arr[DatenFilm.FILM_SENDER]);
//            // zum Testen immer machen!!
//            if (!l.isEmpty()) {
//                film.arr[DatenFilm.FILM_GROESSE] = l;
//                film.arr[DatenFilm.FILM_URL] = url_;
//            } else if (urlExists(url_)) {
//                // dann wars wohl nur ein "403er"
//                film.arr[DatenFilm.FILM_URL] = url_;
//            } else {
//                Log.errorLog(945120369, "urlTauschen: " + urlSeite);
//            }
//        }
//    }
//
//    private void updateHd(String from, String to, DatenFilm film, String urlSeite) {
//        if (film.arr[DatenFilm.FILM_URL_HD].isEmpty() && film.arr[DatenFilm.FILM_URL].endsWith(from)) {
//            String url_ = film.arr[DatenFilm.FILM_URL].substring(0, film.arr[DatenFilm.FILM_URL].lastIndexOf(from)) + to;
//            // zum Testen immer machen!!
//            if (urlExists(url_)) {
//                addUrlHd(film, url_, "");
//            } else {
//                Log.errorLog(945120147, "urlTauschen: " + urlSeite);
//            }
//        }
//    }
//
//    private String getKlein(String url1, String url2) {
//        String ret = "";
//        boolean diff = false;
//        for (int i = 0; i < url2.length(); ++i) {
//            if (url1.length() > i) {
//                if (url1.charAt(i) != url2.charAt(i)) {
//                    if (!diff) {
//                        ret = i + "|";
//                    }
//                    diff = true;
//                }
//            } else {
//                diff = true;
//            }
//            if (diff) {
//                ret += url2.charAt(i);
//            }
//        }
//        return ret;
//    }
//
//    private void addUrlHd(DatenFilm film, String url, String urlRtmp) {
//        film.arr[DatenFilm.FILM_URL_HD] = url.isEmpty() ? "" : getKlein(film.arr[DatenFilm.FILM_URL], url);
//        film.arr[DatenFilm.FILM_URL_RTMP_HD] = urlRtmp.isEmpty() ? "" : getKlein(film.arr[DatenFilm.FILM_URL_RTMP], urlRtmp);
//    }
//
//    final int TIMEOUT = 3000; // ms //ToDo evtl. wieder kürzen!!
//
//    private boolean urlExists(String url) {
//        // liefert liefert true, wenn es die URL gibt
//        // brauchts, um Filmurls zu prüfen
//        int retCode;
//        if (!url.toLowerCase().startsWith("http")) {
//            return false;
//        }
//        try {
//            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
//            conn.setRequestProperty("User-Agent", Config.getUserAgent());
//            conn.setReadTimeout(TIMEOUT);
//            conn.setConnectTimeout(TIMEOUT);
//            if ((retCode = conn.getResponseCode()) < 400) {
//                return true;
//            } else if (retCode == 403) {
//                // aber sie gibt es :)
//                return true;
//            }
//            conn.disconnect();
//        } catch (Exception ignored) {
//        }
//        return false;
//    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.JTabbedPane jTabbedSender = new javax.swing.JTabbedPane();
        jPanelFilmlisteLaden = new javax.swing.JPanel();
        javax.swing.JPanel jPanelFilmliste = new javax.swing.JPanel();
        javax.swing.JPanel jPanelSender = new javax.swing.JPanel();
        jPanelLoeschen = new javax.swing.JPanel();
        jButtonFilmlisteLoeschen = new javax.swing.JButton();
        jButtonNeuLaden = new javax.swing.JButton();
        jButtonCheck = new javax.swing.JButton();
        jButtonClean = new javax.swing.JButton();
        javax.swing.JPanel jPanelTools = new javax.swing.JPanel();
        jButtonFehler = new javax.swing.JButton();
        jButtonAllesSpeichern = new javax.swing.JButton();
        btnDiff = new javax.swing.JButton();
        txtDiff = new javax.swing.JTextField();
        btnPathDiff = new javax.swing.JButton();
        btnDelDoppelteUrls = new javax.swing.JButton();
        jButtonAddOld = new javax.swing.JButton();
        jTextFieldOld = new javax.swing.JTextField();
        btnNurDoppelte = new javax.swing.JButton();
        jButtonHashOlddoppelt = new javax.swing.JButton();
        jButtonTTUrl = new javax.swing.JButton();
        jButtonLiveStreams = new javax.swing.JButton();
        jTextFieldLiveStreams = new javax.swing.JTextField();
        jButtonDelLive = new javax.swing.JButton();
        jButtonOldList = new javax.swing.JButton();
        cbkUrl = new javax.swing.JCheckBox();
        jPanelStarts = new javax.swing.JPanel();

        javax.swing.GroupLayout jPanelFilmlisteLadenLayout = new javax.swing.GroupLayout(jPanelFilmlisteLaden);
        jPanelFilmlisteLaden.setLayout(jPanelFilmlisteLadenLayout);
        jPanelFilmlisteLadenLayout.setHorizontalGroup(
            jPanelFilmlisteLadenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 725, Short.MAX_VALUE)
        );
        jPanelFilmlisteLadenLayout.setVerticalGroup(
            jPanelFilmlisteLadenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 419, Short.MAX_VALUE)
        );

        jTabbedSender.addTab("Filmliste laden", jPanelFilmlisteLaden);

        jPanelSender.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED), "Sender löschen"));

        javax.swing.GroupLayout jPanelLoeschenLayout = new javax.swing.GroupLayout(jPanelLoeschen);
        jPanelLoeschen.setLayout(jPanelLoeschenLayout);
        jPanelLoeschenLayout.setHorizontalGroup(
            jPanelLoeschenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        jPanelLoeschenLayout.setVerticalGroup(
            jPanelLoeschenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanelSenderLayout = new javax.swing.GroupLayout(jPanelSender);
        jPanelSender.setLayout(jPanelSenderLayout);
        jPanelSenderLayout.setHorizontalGroup(
            jPanelSenderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelSenderLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanelLoeschen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelSenderLayout.setVerticalGroup(
            jPanelSenderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelSenderLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanelLoeschen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(285, Short.MAX_VALUE))
        );

        jButtonFilmlisteLoeschen.setText("gesamte Filmliste löschen");

        jButtonNeuLaden.setText("gespeicherte Filmliste neu laden");

        jButtonCheck.setText("Check Filmliste");

        jButtonClean.setText("Clean Filmliste (unescape)");

        javax.swing.GroupLayout jPanelFilmlisteLayout = new javax.swing.GroupLayout(jPanelFilmliste);
        jPanelFilmliste.setLayout(jPanelFilmlisteLayout);
        jPanelFilmlisteLayout.setHorizontalGroup(
            jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelFilmlisteLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanelSender, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanelFilmlisteLayout.createSequentialGroup()
                        .addGroup(jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanelFilmlisteLayout.createSequentialGroup()
                                .addComponent(jButtonFilmlisteLoeschen)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jButtonNeuLaden))
                            .addGroup(jPanelFilmlisteLayout.createSequentialGroup()
                                .addComponent(jButtonCheck)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jButtonClean, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );

        jPanelFilmlisteLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButtonCheck, jButtonFilmlisteLoeschen, jButtonNeuLaden});

        jPanelFilmlisteLayout.setVerticalGroup(
            jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelFilmlisteLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonFilmlisteLoeschen)
                    .addComponent(jButtonNeuLaden))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanelFilmlisteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonCheck)
                    .addComponent(jButtonClean))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanelSender, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedSender.addTab("Filmliste", jPanelFilmliste);

        jButtonFehler.setText("Fehler ausgeben");

        jButtonAllesSpeichern.setText("alles speichern");

        btnDiff.setText("was fehlt in der Liste:");

        txtDiff.setText("/home/emil/Desktop/thschüss/filmlisten/alex/filme.json-summe");

        btnPathDiff.setText(":::");

        btnDelDoppelteUrls.setText("doppelte URLs löschen");

        jButtonAddOld.setText("Alte Filmliste");

        jTextFieldOld.setText("/tmp/usb/2016-09-10-filme.xz");

        btnNurDoppelte.setText("NUR doppelte URLs");

        jButtonHashOlddoppelt.setText("NUR doppelte HashOld");

        jButtonTTUrl.setText("NUR doppelte Th+Ti+Url");

        jButtonLiveStreams.setText("Live-Streams einfügen");

        jTextFieldLiveStreams.setText("http://zdfmediathk.sourceforge.net/live-streams.json");

        jButtonDelLive.setText("live löschen");

        jButtonOldList.setText(":::");

        cbkUrl.setText("nur URL");

        javax.swing.GroupLayout jPanelToolsLayout = new javax.swing.GroupLayout(jPanelTools);
        jPanelTools.setLayout(jPanelToolsLayout);
        jPanelToolsLayout.setHorizontalGroup(
            jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelToolsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelToolsLayout.createSequentialGroup()
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jButtonLiveStreams, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButtonAddOld, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(jButtonAllesSpeichern, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE)
                                .addComponent(btnDiff, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jTextFieldLiveStreams, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 355, Short.MAX_VALUE)
                            .addComponent(jTextFieldOld, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtDiff, javax.swing.GroupLayout.DEFAULT_SIZE, 355, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jButtonOldList)
                            .addGroup(jPanelToolsLayout.createSequentialGroup()
                                .addComponent(btnPathDiff)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(cbkUrl))
                            .addComponent(jButtonDelLive)))
                    .addGroup(jPanelToolsLayout.createSequentialGroup()
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanelToolsLayout.createSequentialGroup()
                                .addComponent(btnNurDoppelte)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButtonHashOlddoppelt)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButtonTTUrl))
                            .addComponent(btnDelDoppelteUrls, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButtonFehler))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );

        jPanelToolsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btnDelDoppelteUrls, btnDiff, btnNurDoppelte, jButtonAllesSpeichern, jButtonFehler, jButtonHashOlddoppelt, jButtonTTUrl});

        jPanelToolsLayout.setVerticalGroup(
            jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelToolsLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonAllesSpeichern)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButtonFehler)
                .addGap(18, 18, 18)
                .addComponent(btnDelDoppelteUrls)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnNurDoppelte)
                    .addComponent(jButtonHashOlddoppelt)
                    .addComponent(jButtonTTUrl))
                .addGap(76, 76, 76)
                .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanelToolsLayout.createSequentialGroup()
                        .addComponent(jButtonLiveStreams)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jButtonAddOld)
                            .addComponent(jTextFieldOld, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButtonOldList))
                        .addGap(18, 18, 18)
                        .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnDiff)
                            .addComponent(txtDiff, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(btnPathDiff)
                            .addComponent(cbkUrl)))
                    .addGroup(jPanelToolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextFieldLiveStreams, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButtonDelLive)))
                .addContainerGap(102, Short.MAX_VALUE))
        );

        jPanelToolsLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {btnPathDiff, txtDiff});

        jPanelToolsLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jButtonAddOld, jTextFieldOld});

        jPanelToolsLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jButtonLiveStreams, jTextFieldLiveStreams});

        jTabbedSender.addTab("Tool", jPanelTools);

        javax.swing.GroupLayout jPanelStartsLayout = new javax.swing.GroupLayout(jPanelStarts);
        jPanelStarts.setLayout(jPanelStartsLayout);
        jPanelStartsLayout.setHorizontalGroup(
            jPanelStartsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 725, Short.MAX_VALUE)
        );
        jPanelStartsLayout.setVerticalGroup(
            jPanelStartsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 419, Short.MAX_VALUE)
        );

        jTabbedSender.addTab("Starts", jPanelStarts);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedSender)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedSender)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnDelDoppelteUrls;
    private javax.swing.JButton btnDiff;
    private javax.swing.JButton btnNurDoppelte;
    private javax.swing.JButton btnPathDiff;
    private javax.swing.JCheckBox cbkUrl;
    private javax.swing.JButton jButtonAddOld;
    private javax.swing.JButton jButtonAllesSpeichern;
    private javax.swing.JButton jButtonCheck;
    private javax.swing.JButton jButtonClean;
    private javax.swing.JButton jButtonDelLive;
    private javax.swing.JButton jButtonFehler;
    private javax.swing.JButton jButtonFilmlisteLoeschen;
    private javax.swing.JButton jButtonHashOlddoppelt;
    private javax.swing.JButton jButtonLiveStreams;
    private javax.swing.JButton jButtonNeuLaden;
    private javax.swing.JButton jButtonOldList;
    private javax.swing.JButton jButtonTTUrl;
    private javax.swing.JPanel jPanelFilmlisteLaden;
    private javax.swing.JPanel jPanelLoeschen;
    private javax.swing.JPanel jPanelStarts;
    private javax.swing.JTextField jTextFieldLiveStreams;
    private javax.swing.JTextField jTextFieldOld;
    private javax.swing.JTextField txtDiff;
    // End of variables declaration//GEN-END:variables

    private class BeobSenderLoeschen implements ActionListener {

        private final String sender;

        public BeobSenderLoeschen(String ssender) {
            sender = ssender;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            daten.getListeFilme().deleteAllFilms(sender);
            daten.getListeBlacklist().filterListe();
            Listener.notify(Listener.EREIGNIS_BLACKLIST_GEAENDERT, GuiDebug.class.getSimpleName());
        }
    }

    private class BeobPfad implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //we can use native chooser on Mac...
            if (SystemInfo.isMacOSX()) {
                FileDialog chooser = new FileDialog(daten.getMediathekGui(), "Pfad");
                chooser.setMode(FileDialog.SAVE);
                chooser.setVisible(true);
                if (chooser.getFile() != null) {
                    try {
                        File destination = new File(chooser.getDirectory() + chooser.getFile());
                        txtDiff.setText(destination.getAbsolutePath());
                    } catch (Exception ex) {
                        Log.errorLog(679890147, ex);
                    }
                }
            } else {
                int returnVal;
                JFileChooser chooser = new JFileChooser();
                if (!txtDiff.getText().equals("")) {
                    chooser.setCurrentDirectory(new File(txtDiff.getText()));
                }
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.setFileHidingEnabled(false);
                returnVal = chooser.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    try {
                        txtDiff.setText(chooser.getSelectedFile().getAbsolutePath());
                    } catch (Exception ex) {
                        Log.errorLog(911025463, ex);
                    }
                }
            }
        }
    }

    private class BeobPfadOldUrl implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //we can use native chooser on Mac...
            if (SystemInfo.isMacOSX()) {
                FileDialog chooser = new FileDialog(daten.getMediathekGui(), "Pfad");
                chooser.setMode(FileDialog.SAVE);
                chooser.setVisible(true);
                if (chooser.getFile() != null) {
                    try {
                        File destination = new File(chooser.getDirectory() + chooser.getFile());
                        jTextFieldOld.setText(destination.getAbsolutePath());
                    } catch (Exception ex) {
                        Log.errorLog(679890147, ex);
                    }
                }
            } else {
                int returnVal;
                JFileChooser chooser = new JFileChooser();
                if (!jTextFieldOld.getText().equals("")) {
                    chooser.setCurrentDirectory(new File(jTextFieldOld.getText()));
                }
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.setFileHidingEnabled(false);
                returnVal = chooser.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    try {
                        jTextFieldOld.setText(chooser.getSelectedFile().getAbsolutePath());
                    } catch (Exception ex) {
                        Log.errorLog(911025463, ex);
                    }
                }
            }
        }
    }

}
