I am not sure exactly what you are doing, but let's say you have a heightmap. It's easy to make a normal map out of that, and read that texture for the normal, instead of calculating it in the shader from the height. Now you have a normal, let's say it is 0,0,1. Okay, let's just swap the y and z axes, and now you have your world normal, 0,1,0. You can add in another high-frequency normal map lookup to get some more detail if you want.
Then take your directional light direction in world space. You can calculate this and upload the vec3 to the shader each frame. The world space vector of the light direction would equal TFormVector(Vec3(0,0,1),light,Null).
Now take the dot product of the light direction in world space and the water surface normal in world space, and that tells you how "lit" the pixel is. This can be used with a specular equation to calculate specular reflection.