Four hours is way to excessive for a nap for a four year old. Like you said, he is probably making up for not going to sleep well at night.
First I would move his bedtime to 7:00, 8:00 is when my second grader starts getting ready for bed. A three year old should be sleeping a good 13 hours solid including naps. Getting so tired like you said on only 7 hours at night is going to effect his mood and his health. I know if my kids get overly tired that it makes it hard for them to sleep. Try getting him to bed before he is wiped out and doing it sooner. For naps, how long does he take before he falls asleep? My rule was if around three they took longer then 20 minutes to fall asleep, they weren't tired and I wasn't going to force daytime sleeping. I then just adjusted an earlier bedtime then.
My four year old is in bed by 7:30!
Then take the toys out of his room, so he has nothing to play with. Start a chart for every night he goes to sleep without an issue. Have him earn the toys back with positive behavior. For my son we started each morning off with four bedtimes stories, if he didn't nap well or fought bedtime he lost a book for every little issue we had, so some nights no story, even now this works so well for him as he loves bedtime stories!!!!
We do our bedtime routine. I stagger it between the two by an hour so my oldest isn't going to bed that early. I put my kids to bed and they know they had to stay in bed. Of course you cannot force sleep but you can lay down the law they are not to get out of bed once in it. For every night he doesn't go down well, tell him you will move his bedtime up by 15 minutes! Meaning earlier!
My son last year was in bed asleep by 6:45 because he chose to give up naps. He made a deal with me if he gave up naps he would go to bed earlier, so we did it. Now he is four I have moved up his bedtime to 7:30 and my daughter 8;30 and both sleep until 7:00am.