/**
 *  Copyright (C) 2020 Savoir-faire Linux Inc.
 *
 *  Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
 *
 *  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, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
 */

#include "CenterCircleMediaHandler.h"

#include "pluglog.h"

const char sep = separator();
const std::string TAG = "CenterCircle";

#define NAME "CenterCircle"

namespace jami {

CenterCircleMediaHandler::CenterCircleMediaHandler(std::map<std::string, std::string>&& ppm,
                                                   std::string&& datapath)
    : datapath_ {datapath}
    , ppm_ {ppm}
{
    setId(datapath_);
    mVS = std::make_shared<CenterCircleVideoSubscriber>(datapath_);
    auto it = ppm_.find("color");
    if (it != ppm_.end()) {
        mVS->setColor(it->second);
    } else {
        mVS->setColor("#0000FF");
    }
}

void
CenterCircleMediaHandler::notifyAVFrameSubject(const StreamData& data, jami::avSubjectPtr subject)
{
    std::ostringstream oss;
    std::string direction = data.direction ? "Receive" : "Preview";
    oss << "NEW SUBJECT: [" << data.id << "," << direction << "]" << std::endl;

    bool preferredStreamDirection = false; // false for output; true for input
    auto it = ppm_.find("videostream");
    if (it != ppm_.end()) {
        preferredStreamDirection = it->second == "1";
    }
    oss << "preferredStreamDirection " << preferredStreamDirection << std::endl;
    if (data.type == StreamType::video && !data.direction
        && data.direction == preferredStreamDirection) {
        subject->attach(mVS.get()); // your image
        oss << "got my sent image attached" << std::endl;
        attached_ = "1";
    } else if (data.type == StreamType::video && data.direction
               && data.direction == preferredStreamDirection) {
        subject->attach(mVS.get()); // the image you receive from others on the call
        oss << "got received image attached" << std::endl;
        attached_ = "1";
    }

    Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
}

std::map<std::string, std::string>
CenterCircleMediaHandler::getCallMediaHandlerDetails()
{
    return {{"name", NAME},
            {"iconPath", datapath_ + sep + "icon.png"},
            {"pluginId", id()},
            {"attached", attached_},
            {"dataType", "1"}};
}

void
CenterCircleMediaHandler::setPreferenceAttribute(const std::string& key, const std::string& value)
{
    auto it = ppm_.find(key);
    if (it != ppm_.end() && it->second != value) {
        it->second = value;

        if (key == "color") {
            mVS->setColor(value);
            return;
        }
    }
}

bool
CenterCircleMediaHandler::preferenceMapHasKey(const std::string& key)
{
    if (key == "color") {
        return true;
    }

    return false;
}

void
CenterCircleMediaHandler::detach()
{
    attached_ = "0";
    mVS->detach();
}

CenterCircleMediaHandler::~CenterCircleMediaHandler()
{
    std::ostringstream oss;
    oss << " ~CenterCircleMediaHandler from HelloWorld Plugin" << std::endl;
    Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
    detach();
}
} // namespace jami
