# This is the Module for Code output in different style
# Specified for Genshin Impact, Types are Float32

module FileCodeOutput
using Dates

export Print2DMatrix,Print3DMatrix,PrintScriptVersion

# syntax dictionary
dictLanguage=Dict(
    "C"=>Dict(
    "termsuffix"=> "f",
    "termSplitter" => ", ",
    "lineStart" => "{",
    "lineEnd" => "},",
    "matrixStart" => "{",
    "matrixEnd" => "}",
    "comment" => "//",
    "terminator" => ";",
    ),
    "Julia"=>Dict(
    "termsuffix" => "f0",
    "termSplitter" => " ",
    "lineStart" => "",
    "lineEnd" => ";",
    "matrixStart" => "[",
    "matrixEnd" => "]",
    "comment" => "#",
    "terminator" => ";",
    ),
);

# Function to print Basic infomation
function PrintScriptVersion(f,s::String,v::String;codeStyle="C")
    print(f,dictLanguage[codeStyle]["comment"]*" This is a piece of code generated by hypergraph\\GenshinDataConverter\n");
    print(f,dictLanguage[codeStyle]["comment"]*" Code Style: "*codeStyle*"\n");
    print(f,dictLanguage[codeStyle]["comment"]*" Script Version: "*s*"\n");
    print(f,dictLanguage[codeStyle]["comment"]*" Your Version: "*v*"\n");
    print(f,dictLanguage[codeStyle]["comment"]*" Time of Code Generation: "*Dates.format(now(), "yyyy-mm-dd HH:MM")*"\n");
end

# Function to print 2D Data
function Print2DMatrix(f,M;tabLen=0,varName="",codeStyle="C")
    global dictLanguage

    # print variableName if needed
    if varName!=""
        if codeStyle=="C"
            print(f, "float "*varName);
            for i in 1:length(size(M))
                print(f,"["*string(size(M)[i])*"]");
            end
            print(f,"=");

        elseif codeStyle=="Julia"
            print(f,varName*"=");
        
        else
            error("Keyword codeStyle unsupported!")
        end
    end

    # print the mainpart of 2D Matrix
    print(f, repeat(" ",tabLen*4) * dictLanguage[codeStyle]["matrixStart"] * "\n");
    for i in 1:size(M)[1]
        print(f, repeat(" ", (tabLen+1)*4) * dictLanguage[codeStyle]["lineStart"]);
        for j in 1:size(M)[2]
            print(f, string(M[i,j]) * dictLanguage[codeStyle]["termsuffix"] * dictLanguage[codeStyle]["termSplitter"]);
        end
        print(f, dictLanguage[codeStyle]["lineEnd"] * "\n");
    end
    print(f, repeat(" ",tabLen*4) * dictLanguage[codeStyle]["matrixEnd"]);

    # print Terminator
    (varName!="")&&print(f, dictLanguage[codeStyle]["terminator"]);
    (varName=="")&&print(f, dictLanguage[codeStyle]["termSplitter"]);
    print(f,"\n");

end

# Function to print 3D Data
function Print3DMatrix(f,M;tabLen=0,varName="",codeStyle="C")
    global dictlanguage

    # print variableName if needed
    if varName!=""
        if codeStyle=="C"
            print(f, "float "*varName);
            for i in 1:length(size(M))
                print(f,"["*string(size(M)[i])*"]");
            end
            print(f,"=");

        elseif codeStyle=="Julia"
            print(f,varName*"=");
        
        else
            error("Keyword codeStyle unsupported!")
        end
    end

    # print the main part in different codeStyle
    if codeStyle=="C"
        print(f,"\n");
        print(f,repeat(" ",tabLen*4) * "{\n");
            for i in 1:size(M)[1]
                Print2DMatrix(f,M[i,:,:];tabLen=tabLen+1,codeStyle="C")
            end
        print(f,"}");

    elseif codeStyle=="Julia"
        print(f,"fill(0f0,"*string(size(M)[1])*","*string(size(M)[2])*","*string(size(M)[3])*");\n");
        for i in 1:size(M)[1]
            Print2DMatrix(f,M[i,:,:];varName=varName*"["*string(i)*",:,:]",codeStyle="Julia");
        end

    else
        error("Keyword codeStyle unsupported!")
    end

    # print Terminator
    (varName!="")&&(codeStyle=="C")&&print(f, dictLanguage[codeStyle]["terminator"]);
    print(f,"\n");
end

# Function to print a Sturcture/Dictionary or such
# function PrintDict()
# end

end

