Toon Shading Light Direction
Unless you have special reasons to use Cycles, I would consider using EEVEE for, at least, the main passes of your work, because of the Shader to RGB node.

The Shader to RGB node, which really can't be implemented in a path-tracer like Cycles without calling the whole renderer twice, allows you to take the actual light-response of a surface, capture that color, and then use it in any way you like further down the pipeline.

In that workflow, you could, for example, choose to forget coloring by Normal, and actually light a pure-white diffuse version of your model, and maybe a black highly specular version of your model, and so on.. by using different shaders all in the same node tree.

You can then grab the tones from those shaders as RGB, put them trough thresholds, quantize them, use them as masks for textures, do half-toning with them,  tint them with colors that are not actually in the scene .. almost anything. 

Not your style, but there's an example here of half-toning and tinting. A search on 'NPR' and 'Shader to RGB' turns up plenty of examples, some good, some not-so-good...