Preheat your grill or oven to medium-high heat.
In a large bowl, mix together yogurt, lemon juice, cumin, smoked paprika, garam masala, coriander, turmeric, chili flakes (if using), and salt.
Add the chicken pieces to the marinade and coat them evenly. Cover and refrigerate for at least 30 minutes or up to 2 hours.
Remove the chicken from the marinade and place it on a grill or baking sheet. Discard the remaining marinade.
Grill or bake the chicken until it's cooked through and slightly charred, about 6-8 minutes per side.
While the chicken cooks, prepare the tomato sauce. Heat oil in a saucepan over medium heat. Add sliced onions and cook until they're translucent and starting to caramelize, about 8-10 minutes.
Add minced garlic, grated ginger, garam masala powder, cinnamon, cardamom, and cayenne pepper (if using) to the saucepan. Cook for another minute, stirring constantly.
Stir in diced tomatoes, heavy cream or half-and-half, and a pinch of salt. Bring the mixture to a simmer.
Once the chicken is cooked, transfer it to a plate and cover it with foil to rest. Pour the tomato sauce over the chicken and let it simmer for 5-7 minutes, allowing the flavors to meld together.
Garnish with fresh cilantro and serve with steaming hot basmati rice or naan bread. Offer raita (a yogurt-based side dish) as an optional accompaniment.