#include "fileSeries.hpp"
#include "oFstream.hpp"
#include "streams.hpp"

void pFlow::PFtoVTK::fileSeries::writeOneBaseName(const word &baseName)
{
    auto& fList = timeFiles_[baseName];
    word fileName = baseName + ".vtk.series";
    oFstream os(destDir_+fileName);
    
    REPORT(1)<<"Writing to "<<os.name()<<END_REPORT;

    os<<"{\n";
    os<<"    \"file-series-version\" : \"1.0\",\n";
    os<<"    \"files\" : [\n";
    const auto lastItem = std::prev(fList.end());
    for(auto iter = fList.begin(); iter != fList.end(); ++iter)
    {
        os<<"        {\"name\" : \"";
        os<< iter->second;
        os<<"\", \"time\" :";
        os<<iter->first;
        if(iter == lastItem)
            os<<"}\n";
        else
            os<<"},\n";
    }
    os<<"    ]\n";
    os<<"}\n";
   
}

pFlow::PFtoVTK::fileSeries::fileSeries(const fileSystem dest)
    : destDir_(dest)
{
    

}

pFlow::PFtoVTK::fileSeries::~fileSeries()
{
    REPORT(0)<<"Writing time series files..."<<END_REPORT;
    for(const auto& fSeries:timeFiles_)
    {
        writeOneBaseName(fSeries.first);
    }
}

bool pFlow::PFtoVTK::fileSeries::addTimeFile(const word& baseName, real time, const word &fileName)
{
    fileSystem fs(fileName);
    word relFileName = fs.relative(destDir_).wordPath();

    if( auto [iter, found]=timeFiles_.findIf(baseName); found )
    {
        return iter->second.insertIf(time, relFileName);
    }
    else
    {   
        TimeFileType newList;
        newList.insertIf(time, relFileName);
        return timeFiles_.insertIf(baseName, newList);
    }
    
}

bool pFlow::PFtoVTK::fileSeries::addTimeFile(const wordList &baseNames, real time, const wordList &fileNames)
{
    if(baseNames.size()!= fileNames.size() )
    {
        fatalErrorInFunction<<"sizes of base names and file names are not equal\n";
        return false;
    }

    for(size_t i=0; i<baseNames.size(); i++)
    {
        if(!addTimeFile(baseNames[i], time, fileNames[i]))
        {
            fatalErrorInFunction<<"Error in adding multiple time files\n";
            return false;
        }
    }

    return true;
}