Rahul,
This looks like you are trying to duplicate the standard functionality. If you take steps 4 & 5 together, then you have the whole 0-100 covered, so ACD will select the agent with the highest skill proficiency. I cannot see how splitting it in this way will benefit you.
Say, I have 2 Agents, A has proficiency 90 and B has proficiency 70. Using your methodology, then if A is available, step 4 will route the call to Agent A, if not then step 5 will route it to B. If neither is available, then it will wait. Depending on exactly how you configure step 5, if the call is waiting and Agent A becomes available, then they may not get it!! If, however you simply route the call to the Workgroup using built-in functionality, then if A is Available, they will get it, otherwise B will get it. If neither is available, it will wait for one of them. The only situatio in which B MIGHT get a call when A is available is if they have been idle for a long time, but you can always exclude the agent idle from the ACD calculation. You don't even need Custom ACD or Handlers to do this....
I'm also unclear why Language 1 and Language 2 are treated differently?
If this won't work for you, can you take a step back and explain what you are actually trying to achieve with this solution (higher level overview)?