#include "Core/DateTime.h"
#include "Core/IoContext.h"
#include "Core/Logger.h"
#include "Core/Singleton.h"
#include "RtspServer.h"
#include "VideoInput.h"
#include "rw_mpp_api.h"
#include <boost/asio/signal_set.hpp>
#include <fstream>

int main(int argc, char const *argv[]) {
    using namespace Core;
    LOG(info) << "app start...";
    int status = rw_mpp__init();
    if (status != 0) {
        LOG(error) << "rw_mpp__init() failed, status: " << status;
        return -1;
    }
    try {
        auto ioContext = Singleton<IoContext>::construct(std::thread::hardware_concurrency());
        auto rtsp = std::make_shared<RtspServer>();

        std::shared_ptr<std::ofstream> ofs;
        std::ostringstream oss;
        oss << "/data/sdcard/video/record_" << DateTime::currentDateTime().toString("%Y%m%d%H%M%S") << ".h264";
        auto path = oss.str();
        LOG(info) << "write h264 to " << path;
        ofs = std::make_shared<std::ofstream>(path, std::ofstream::binary);

        auto video = std::make_shared<VideoInput>(2592, 1536);
        video->setPacketHandler([&](const uint8_t *data, uint32_t size) {
            ofs->write(reinterpret_cast<const char *>(data), size);
            // pusher->push(data, size);
            rtsp->push(data, size);
        });
        // video->start();
        video->startFileInput("/data/sdcard/HM1.264", 1280, 720);
        video->startEncode();
        boost::asio::signal_set signals(*ioContext->ioContext(), SIGINT);
        signals.async_wait([&](boost::system::error_code const &, int signal) {
            LOG(info) << "capture " << (signal == SIGINT ? "SIGINT" : "SIGTERM") << ",stop!";
            video.reset();
            rw_mpp__finalize();
            ioContext->ioContext()->stop();
        });

        ioContext->run(false);
    } catch (const boost::exception &e) {
        LOG(error) << "error";
    } catch (const std::exception &e) {
        LOG(error) << e.what();
    }

    rw_mpp__finalize();
    return 0;
}
