| Condensed Consolidated Statements of Changes in Redeemable Non-Controlling Interests and Stockholders' Equity - USD ($)$ in Thousands
 | Total | Class A Common Stock | Class B Common Stock | Common Stock  Class A Common Stock | Common Stock  Class B Common Stock | Additional Paid-in Capital | Retained Earnings | Accumulated Other Comprehensive Loss | Treasury Stock | Non-controlling Interests | 
| Redeemable non-controlling interests, beginning balance at Dec. 31, 2021 | $ 46,182 |  |  |  |  |  |  |  |  |  | 
| Increase (Decrease) in Temporary Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Distributions to redeemable non-controlling interests | (651) |  |  |  |  |  |  |  |  |  | 
| Accretion of tax equity financing fees | 54 |  |  |  |  |  |  |  |  |  | 
| Investment fund call option exercise | (238) |  |  |  |  |  |  |  |  |  | 
| Net income | 2,571 |  |  |  |  |  |  |  |  |  | 
| Redeemable non-controlling interests, ending balance at Jun. 30, 2022 | 47,918 |  |  |  |  |  |  |  |  |  | 
| Beginning balance (in shares) at Dec. 31, 2021 |  |  |  | 33,716,309 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, beginning balance (in shares) at Dec. 31, 2021 |  |  |  |  |  |  |  |  | 2,101,795 |  | 
| Beginning balance at Dec. 31, 2021 | 704,264 |  |  | $ 3 | $ 2 | $ 283,982 | $ 438,732 | $ (6,667) | $ (11,788) | $ 0 | 
| Increase (Decrease) in Stockholders' Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Exercise of stock options (in shares) |  |  |  | 100,588 |  |  |  |  |  |  | 
| Exercise of stock options | 1,866 |  |  |  |  | 1,866 |  |  |  |  | 
| Stock-based compensation expense | 7,206 |  |  |  |  | 7,206 |  |  |  |  | 
| Employee stock purchase plan (in shares) |  |  |  | 16,996 |  |  |  |  |  |  | 
| Employee stock purchase plan | 948 |  |  |  |  | 948 |  |  |  |  | 
| Unrealized gain (loss) from interest rate hedges, net | 4,276 |  |  |  |  |  |  | 4,276 |  |  | 
| Foreign currency translation adjustment | (1,963) |  |  |  |  |  |  | (1,963) |  |  | 
| Accretion of tax equity financing fees | (54) |  |  |  |  |  | (54) |  |  |  | 
| Investment fund call option exercise | 238 |  |  |  |  | 238 |  |  |  |  | 
| Contributions from non-controlling interests | 15,186 |  |  |  |  |  |  |  |  | 15,186 | 
| Net income | 49,600 |  |  |  |  |  | 49,600 |  |  |  | 
| Ending balance (in shares) at Jun. 30, 2022 |  |  |  | 33,833,893 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, ending balance (in shares) at Jun. 30, 2022 |  |  |  |  |  |  |  |  | 2,101,795 |  | 
| Ending balance at Jun. 30, 2022 | 781,567 |  |  | $ 3 | $ 2 | 294,240 | 488,278 | (4,354) | $ (11,788) | 15,186 | 
| Redeemable non-controlling interests, beginning balance at Mar. 31, 2022 | 47,438 |  |  |  |  |  |  |  |  |  | 
| Increase (Decrease) in Temporary Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Distributions to redeemable non-controlling interests | (204) |  |  |  |  |  |  |  |  |  | 
| Accretion of tax equity financing fees | 27 |  |  |  |  |  |  |  |  |  | 
| Net income | 657 |  |  |  |  |  |  |  |  |  | 
| Redeemable non-controlling interests, ending balance at Jun. 30, 2022 | 47,918 |  |  |  |  |  |  |  |  |  | 
| Beginning balance (in shares) at Mar. 31, 2022 |  |  |  | 33,808,964 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, beginning balance (in shares) at Mar. 31, 2022 |  |  |  |  |  |  |  |  | 2,101,795 |  | 
| Beginning balance at Mar. 31, 2022 | 736,211 |  |  | $ 3 | $ 2 | 289,459 | 456,089 | (3,889) | $ (11,788) | 6,335 | 
| Increase (Decrease) in Stockholders' Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Exercise of stock options (in shares) |  |  |  | 7,933 |  |  |  |  |  |  | 
| Exercise of stock options | 158 |  |  |  |  | 158 |  |  |  |  | 
| Stock-based compensation expense | 3,675 |  |  |  |  | 3,675 |  |  |  |  | 
| Employee stock purchase plan | 948 |  |  |  |  | 948 |  |  |  |  | 
| Unrealized gain (loss) from interest rate hedges, net | 1,565 |  |  |  |  |  |  | 1,565 |  |  | 
| Foreign currency translation adjustment | (2,030) |  |  |  |  |  |  | (2,030) |  |  | 
| Accretion of tax equity financing fees | (27) |  |  |  |  |  | (27) |  |  |  | 
| Contributions from non-controlling interests | 8,851 |  |  |  |  |  |  |  |  | 8,851 | 
| Net income | 32,216 |  |  |  |  |  | 32,216 |  |  |  | 
| Ending balance (in shares) at Jun. 30, 2022 |  |  |  | 33,833,893 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, ending balance (in shares) at Jun. 30, 2022 |  |  |  |  |  |  |  |  | 2,101,795 |  | 
| Ending balance at Jun. 30, 2022 | 781,567 |  |  | $ 3 | $ 2 | 294,240 | 488,278 | (4,354) | $ (11,788) | 15,186 | 
| Redeemable non-controlling interests, beginning balance at Dec. 31, 2022 | 46,623 |  |  |  |  |  |  |  |  |  | 
| Increase (Decrease) in Temporary Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Distributions to redeemable non-controlling interests | (335) |  |  |  |  |  |  |  |  |  | 
| Accretion of tax equity financing fees | 55 |  |  |  |  |  |  |  |  |  | 
| Investment fund call option exercise | 195 |  |  |  |  |  |  |  |  |  | 
| Net income | 1,456 |  |  |  |  |  |  |  |  |  | 
| Redeemable non-controlling interests, ending balance at Jun. 30, 2023 | $ 47,994 |  |  |  |  |  |  |  |  |  | 
| Beginning balance (in shares) at Dec. 31, 2022 |  | 33,948,362 | 18,000,000 | 33,948,362 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, beginning balance (in shares) at Dec. 31, 2022 | 2,101,795 |  |  |  |  |  |  |  | 2,101,795 |  | 
| Beginning balance at Dec. 31, 2022 | $ 873,031 |  |  | $ 3 | $ 2 | 306,314 | 533,549 | (4,051) | $ (11,788) | 49,002 | 
| Increase (Decrease) in Stockholders' Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Exercise of stock options (in shares) |  |  |  | 216,600 |  |  |  |  |  |  | 
| Exercise of stock options | 2,093 |  |  |  |  | 2,093 |  |  |  |  | 
| Stock-based compensation expense | 7,999 |  |  |  |  | 7,999 |  |  |  |  | 
| Employee stock purchase plan (in shares) |  |  |  | 24,833 |  |  |  |  |  |  | 
| Employee stock purchase plan | 1,017 |  |  |  |  | 1,017 |  |  |  |  | 
| Restricted stock units released (in shares) |  |  |  | 10,815 |  |  |  |  |  |  | 
| Unrealized gain (loss) from interest rate hedges, net | (48) |  |  |  |  |  |  | (48) |  |  | 
| Foreign currency translation adjustment | 1,226 |  |  |  |  |  |  | 1,215 |  | 11 | 
| Accretion of tax equity financing fees | (55) |  |  |  |  |  | (55) |  |  |  | 
| Investment fund call option exercise | (195) |  |  |  |  | (195) |  |  |  |  | 
| Contributions from non-controlling interests | 922 |  |  |  |  |  |  |  |  | 922 | 
| Distributions to non-controlling interest | (20,521) |  |  |  |  |  |  |  |  | (20,521) | 
| Net income | $ 8,514 |  |  |  |  |  | 7,470 |  |  | 1,044 | 
| Ending balance (in shares) at Jun. 30, 2023 |  | 34,200,610 | 18,000,000 | 34,200,610 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, ending balance (in shares) at Jun. 30, 2023 | 2,101,795 |  |  |  |  |  |  |  | 2,101,795 |  | 
| Ending balance at Jun. 30, 2023 | $ 873,983 |  |  | $ 3 | $ 2 | 317,228 | 540,964 | (2,884) | $ (11,788) | 30,458 | 
| Redeemable non-controlling interests, beginning balance at Mar. 31, 2023 | 46,700 |  |  |  |  |  |  |  |  |  | 
| Increase (Decrease) in Temporary Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Distributions to redeemable non-controlling interests | (157) |  |  |  |  |  |  |  |  |  | 
| Accretion of tax equity financing fees | 28 |  |  |  |  |  |  |  |  |  | 
| Net income | 1,423 |  |  |  |  |  |  |  |  |  | 
| Redeemable non-controlling interests, ending balance at Jun. 30, 2023 | 47,994 |  |  |  |  |  |  |  |  |  | 
| Beginning balance (in shares) at Mar. 31, 2023 |  |  |  | 34,030,362 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, beginning balance (in shares) at Mar. 31, 2023 |  |  |  |  |  |  |  |  | 2,101,795 |  | 
| Beginning balance at Mar. 31, 2023 | 894,772 |  |  | $ 3 | $ 2 | 310,726 | 534,624 | (4,645) | $ (11,788) | 65,850 | 
| Increase (Decrease) in Stockholders' Equity [Roll Forward] |  |  |  |  |  |  |  |  |  |  | 
| Exercise of stock options (in shares) |  |  |  | 134,600 |  |  |  |  |  |  | 
| Exercise of stock options | 1,523 |  |  |  |  | 1,523 |  |  |  |  | 
| Stock-based compensation expense | 3,962 |  |  |  |  | 3,962 |  |  |  |  | 
| Employee stock purchase plan (in shares) |  |  |  | 24,833 |  |  |  |  |  |  | 
| Employee stock purchase plan | 1,017 |  |  |  |  | 1,017 |  |  |  |  | 
| Restricted stock units released (in shares) |  |  |  | 10,815 |  |  |  |  |  |  | 
| Unrealized gain (loss) from interest rate hedges, net | 820 |  |  |  |  |  |  | 820 |  |  | 
| Foreign currency translation adjustment | 943 |  |  |  |  |  |  | 941 |  | 2 | 
| Accretion of tax equity financing fees | (28) |  |  |  |  |  | (28) |  |  |  | 
| Contributions from non-controlling interests | 812 |  |  |  |  |  |  |  |  | 812 | 
| Distributions to non-controlling interest | (36,828) |  |  |  |  |  |  |  |  | (36,828) | 
| Net income | $ 6,990 |  |  |  |  |  | 6,368 |  |  | 622 | 
| Ending balance (in shares) at Jun. 30, 2023 |  | 34,200,610 | 18,000,000 | 34,200,610 | 18,000,000 |  |  |  |  |  | 
| Treasury stock, ending balance (in shares) at Jun. 30, 2023 | 2,101,795 |  |  |  |  |  |  |  | 2,101,795 |  | 
| Ending balance at Jun. 30, 2023 | $ 873,983 |  |  | $ 3 | $ 2 | $ 317,228 | $ 540,964 | $ (2,884) | $ (11,788) | $ 30,458 |