In a large bowl, combine the chicken, yogurt, ginger-garlic paste, green chilies, chili powder, turmeric, garam masala, cumin, coriander, lemon juice, and salt.
Add the chopped coriander, mint, and fried onions. Mix everything thoroughly so the chicken is evenly coated.
Cover and marinate the chicken for at least 30 minutes. For deeper flavor, refrigerate it for several hours.
Rinse the basmati rice several times until the water runs mostly clear. Soak it in water for about 20–30 minutes, then drain.
Bring a large pot of water to a boil. Add bay leaves, cardamom, cloves, cinnamon, star anise, cumin seeds, and salt.
Add the soaked rice and cook until it is about 70% cooked. The grains should still be slightly firm in the center.
Drain the rice and set it aside.
Heat the oil or ghee in a large heavy-bottomed pot over medium heat.
Add the sliced onions and cook until golden brown. Remove some of the fried onions for garnishing.
Add the chopped tomatoes and cook until softened.
Add the marinated chicken and cook for about 8–10 minutes, stirring occasionally.
Spread the chicken mixture evenly across the bottom of the pot.
Add the partially cooked rice over the chicken in an even layer.
Sprinkle the saffron soaked in warm milk over the rice.
Add fresh coriander, mint, a little fried onion, and 1 tablespoon of ghee over the top.
Cover the pot tightly with a lid. Cook over low heat for 20–25 minutes so the chicken finishes cooking and the rice absorbs the flavors.
Turn off the heat and let the biryani rest, covered, for 10 minutes.
Gently fluff the rice and chicken together without breaking the rice grains.
Garnish with the remaining fried onions and fresh herbs.
Serve hot with raita, salad, and lemon wedges.