/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2018, Google Inc.
 *
 * media_device.h - Media device handler
 */

#pragma once

#include <map>
#include <sstream>
#include <string>
#include <vector>

#include <linux/media.h>

#include <libcamera/base/log.h>
#include <libcamera/base/signal.h>
#include <libcamera/base/unique_fd.h>

#include "libcamera/internal/media_object.h"

namespace libcamera {

class MediaDevice : protected Loggable
{
public:
	MediaDevice(const std::string &deviceNode);
	~MediaDevice();

	bool acquire();
	void release();
	bool busy() const { return acquired_; }

	bool lock();
	void unlock();

	int populate();
	bool isValid() const { return valid_; }

	const std::string driver() const { return driver_; }
	const std::string deviceNode() const { return deviceNode_; }
	const std::string model() const { return model_; }
	unsigned int version() const { return version_; }
	unsigned int hwRevision() const { return hwRevision_; }

	const std::vector<MediaEntity *> &entities() const { return entities_; }
	MediaEntity *getEntityByName(const std::string &name) const;

	MediaLink *link(const std::string &sourceName, unsigned int sourceIdx,
			const std::string &sinkName, unsigned int sinkIdx);
	MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
			const MediaEntity *sink, unsigned int sinkIdx);
	MediaLink *link(const MediaPad *source, const MediaPad *sink);
	int disableLinks();

	Signal<> disconnected;

protected:
	std::string logPrefix() const override;

private:
	int open();
	void close();

	MediaObject *object(unsigned int id);
	bool addObject(MediaObject *object);
	void clear();

	struct media_v2_interface *findInterface(const struct media_v2_topology &topology,
						 unsigned int entityId);
	bool populateEntities(const struct media_v2_topology &topology);
	bool populatePads(const struct media_v2_topology &topology);
	bool populateLinks(const struct media_v2_topology &topology);
	void fixupEntityFlags(struct media_v2_entity *entity);

	friend int MediaLink::setEnabled(bool enable);
	int setupLink(const MediaLink *link, unsigned int flags);

	std::string driver_;
	std::string deviceNode_;
	std::string model_;
	unsigned int version_;
	unsigned int hwRevision_;

	UniqueFD fd_;
	bool valid_;
	bool acquired_;

	std::map<unsigned int, MediaObject *> objects_;
	std::vector<MediaEntity *> entities_;
};

} /* namespace libcamera */
