#include "player_gui.h"
#include "ui_player_gui.h"

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

#include <vlc/vlc.h>

#include <stdio.h>
#include <stdlib.h>

#include <QFile>
#include <QFrame>
#include <QInputDialog>
#include <QDir>
#include <QStringList>
#include <QTextStream>
#include <QMessageBox>
#include <QtNetwork>

player_gui::player_gui(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::player_gui){

    ui->setupUi(this);

    std::cout << "starte..." << std::endl;
    ui->statusbar->showMessage("starte...", 0);

    this->set_ip();
    this->sender_holen();
    this->sender_laden();
    //this->sender_ausgeben();
    this->on_lineEdit_textChanged("");

    // Play init
    /* Load the VLC engine */
    inst = libvlc_new (0, NULL);
}
player_gui::~player_gui(){
    if(mp){
        /* Stop playing */
        libvlc_media_player_stop (mp);
        /* Free the media_player */
        libvlc_media_player_release (mp);
        libvlc_release (inst);
    }
    std::cout << "beende..." << std::endl;

    delete ui;
}
void player_gui::on_actionBeenden_triggered(){

    exit(0);
}
void player_gui::set_ip(void){
    QFile file("vlc-vdr.ini");
    if(file.open(QIODevice::ReadWrite | QIODevice::Text)){
        std::cout << " oeffnen erfolgreich..." << std::endl;
        QByteArray line = file.readLine();
        QString string = line;
        if(string==""){
            ip = "127.0.0.1:3000";
            QTextStream output(&file);
            output << ip;
        }else{
            ip = string;
        }
        std::cout << ip.toStdString() << " gesetzt..." << std::endl;
    }else{
        std::cout << " oeffnen fehlgeschlagen..." << std::endl;
    }
    file.close();
}
void player_gui::on_actionIP_Adresse_triggered() {
    this->set_ip();
    QFile file("vlc-vdr.ini");
    std::cout << "IP-Adresse setzen..." << std::endl;
    ui->statusbar->showMessage("IP-Adresse setzen...", 0);
    bool ok;
    QString text = QInputDialog::getText(this, "IP-Adresse", "IP-Adresse(127.0.0.1):Port(3000)",
                                         QLineEdit::Normal, ip, &ok);
    if(text!="")
        ip = text;
    if(file.open(QIODevice::WriteOnly | QIODevice::Text)){
        QTextStream output(&file);
        output << ip;
        file.close();
    }
    std::cout << text.toStdString() << " gesetzt." << std::endl;
    ui->statusbar->showMessage("IP-Adresse setzen... gesetzt.", 0);
    this->sender_holen();
    this->sender_laden();
    this->on_lineEdit_textChanged("");
}
size_t player_gui::write_data(void *ptr, size_t size, size_t nmemb, void *stream){
    size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
    return written;
}
int player_gui::sender_holen(void){

    manager = new QNetworkAccessManager();

    QString url = "http://" + ip + "/channels.m3u";
    QNetworkRequest request(url);
    QNetworkReply *reply = manager->get(request);

    connect(reply, &QNetworkReply::finished, [=]() {
        if(reply->error() == QNetworkReply::NoError)
        {
            QByteArray response = reply->readAll();
            std::string Daten = response.toStdString();
            std::cout << Daten << std::endl;
            // do something with the data...
            FILE *file = fopen("channels.m3u", "wb");
            if (file!=NULL)
            {
              std::fputs(response,file);
            }
            fclose(file);
        }
        else // handle error
        {
          ui->statusbar->showMessage(reply->errorString().toUtf8().constData());
          std::cout << reply->errorString().toUtf8().constData() << std::endl;
        }
    });

    return 0;
}
int player_gui::sender_laden(void){
    int x=0;
    this->Sender=1;
    QFile file("channels.m3u");
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
        while (!file.atEnd()){
            QByteArray line = file.readLine();
            if(line.toStdString()=="#EXTM3U\n")     // erste Zeile überspringen
                continue;
            if(line.toStdString()=="\n")            // lezte Zeile überspringen
                break;
            QString string = line;
            string.replace(QString("#EXTINF:-1,"), QString(""));
            string.replace(QString("\n"), QString(""));     // Zeilenede entfernen
            if(++x%2){
                std::cout << this->Sender << " Name: " << string.toStdString() << std::endl;
                this->Name[this->Sender]=string;
            } else {
                std::cout << this->Sender <<" Url: " << string.toStdString() << std::endl;
                this->URL[this->Sender++]=string;
            }
        }
        Sender--;   //Senderkorrektur
        file.close();
    } else {
        std::cout << "Fehler channels.m3u" << std::endl;
        return 1;
    }
    return 0;
}
int player_gui::sender_ausgeben(void){
    for(int x=1;x<=this->Sender;x++){
        std::cout << x << ". " << this->Name[x].toStdString() << "," << this->URL[x].toStdString() << std::endl;
    }
    return 0;
}
void player_gui::on_lineEdit_textChanged(const QString &arg1){
    std::cout << "suchen" << std::endl;
    ui->listWidget->clear();
    for(int x=1;x<=this->Sender;x++){
        if(this->Name[x].contains(arg1)){
            ui->listWidget->addItem(this->Name[x]);
        }
    }
}
void player_gui::on_listWidget_itemClicked(QListWidgetItem *item)
{
    std::cout << item->text().toStdString() << std::endl;
    this->play(item);
}
int player_gui::play(QListWidgetItem *item){

    if (!item)
       return 1;
    std::cout << "Sender: " << item->text().toStdString() << std::endl;

    int x=1;

    for(;x<=this->Sender;x++){
        if(item->text()==Name[x]){
            std::cout << "Name: " << Name[x].toStdString() << " URL: " << URL[x].toStdString() << std::endl;
            break;
        }
    }
    ui->statusbar->showMessage(Name[x]+" - "+URL[x], 0);
    /* Stop playing */
    if(mp)
        libvlc_media_player_stop (mp);

    QByteArray bla = URL[x].toLatin1();
    const char *url = bla.data();

    /* Create a new item */
    m = libvlc_media_new_location (inst, url);
    /* Create a media player playing environement */
    mp = libvlc_media_player_new_from_media (m);
    /* No need to keep the media now */
    libvlc_media_release (m);

#if defined(Q_OS_WIN)                                                   // Windows
    libvlc_media_player_set_hwnd(mp, (void *)ui->videoWidget->winId());     //  hwnd
#elif defined(Q_OS_MAC)                                                 // Mac
    libvlc_media_player_set_nsobject(mp, (void *)ui->videoWidget->winId()); //  view
#else                                                                   //Linux
    int windid = ui->videoWidget->winId();
    libvlc_media_player_set_xwindow (mp, windid);                       //  xid
#endif

    std::cout << "play..." << std::endl;
    /* play the media_player */
    libvlc_media_player_play (mp);

    return 0;
}