def create_obj(vertices, textures, normals, faces, filename=None):
    """
    Create content of the OBJ file given the vertices, textures, normals, and faces.

    Args:
        vertices (list): list of vertices (for each corner of a triangular mesh)
        textures (list): list of textures
        normals (list): list of normals
        faces (list): list of faces
        filename (None, str): if a string is provided, it will save the OBJ file in the given file path.

    Returns:
        str: content of the OBJ file.

    References:
        [1] Wavefront .obj file (Wikipedia): https://en.wikipedia.org/wiki/Wavefront_.obj_file
    """

    # create obj list
    obj = []

    # add vertices
    for v in vertices:
        obj.append("v " + str(v[0]) + " " + str(v[1]) + " " + str(v[2]))

    # add textures
    for t in textures:
        obj.append("vt " + str(t[0]) + " " + str(t[1]))

    # add normals
    for n in normals:
        obj.append("vn " + str(n[0]) + " " + str(n[1]) + " " + str(n[2]))

    # add faces
    for f in faces:
        obj.append("f " + f)

    # create document
    obj = '\n'.join(obj)

    # create file if specified
    if filename is not None:
        with open(filename, "w+") as f:
            f.write(obj)
    return obj