/* StreamWriter.h */

/* Copyright (C) 2011-2024 Michael Lugmair (Lucio Carreras)
 *
 * This file is part of sayonara player
 *
 * 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
 * (at your option) 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/>.
 */

#ifndef STREAM_WRITER_H
#define STREAM_WRITER_H

#include "StreamHttpParser.h"
#include "Interfaces/Engine/AudioDataReceiver.h"
#include "Utils/Pimpl.h"

#include <QObject>

class MetaData;
class PlayManager;
class QTcpSocket;
class RawAudioDataProvider;

class StreamWriter :
	public QObject,
	public Engine::RawAudioDataReceiver
{
		Q_OBJECT
		PIMPL(StreamWriter)
	signals:
		void sigNewConnection(const QString& ip);
		void sigDisconnected(StreamWriter* sw);

	public:
		enum class Type :
			uint8_t
		{
			Undefined,
			Standard,
			Invalid,
			Streaming
		};

		StreamWriter(PlayManager* playManager, RawAudioDataProvider* audioDataProvider, QTcpSocket* socket,
		             const QString& ip);
		~StreamWriter() override;

		QString ip() const;

		bool sendPlaylist();
	bool sendFavicon();

		bool sendMetadata();

		bool sendBackground();

		bool sendHtml5();

		bool sendHeader(bool reject);

		StreamHttpParser::HttpAnswer parseMessage();

		void disconnect();

		void dismiss();

		void writeAudioData(const QByteArray& data) override;

	private:
		void reset();

	private slots:
		void socketDisconnected();
		void dataAvailble();
		void clearSocket();
};

using StreamWriterPtr = std::shared_ptr<StreamWriter>;
#endif
