We consider a long-term engine maintenance planning problem for an aircraft fleet. The objective is to guarantee sufficient on-wing engines to reach service levels while effectively organizing shop visits for engines. However, complexity arises from intricate maintenance policies and uncertainty in engine deterioration. To address this problem, we propose a graph-based approach representing high-dimensional engine statuses and transitions. We then formulate the problem as a multi-stage stochastic integer program with endogenous uncertainty. We develop an approximate dynamic programming algorithm enhanced by dynamic graph generation and policy-sifting techniques so as to reduce the computational overhead in large problems. We demonstrate the efficacy of our method, compared with other popular methods, in terms of running time and solution quality. In the case study, we present an implementation in a real-world decision system in China Southern Airlines, in which the proposed method works seamlessly with other supporting modules and significantly improves the efficiency of engine maintenance management.