import 'package:get/get.dart';
import 'package:news_getx/data/model/news.dart';
import 'package:news_getx/data/repository/news_repository.dart';
import 'package:news_getx/modules/main/main_state.dart';

class MainController extends GetxController {
  NewsRepository newsRepository;

  MainController({required this.newsRepository});

  /// 响应式成员变量
  /// 在Getx中，当一个对象被注册为可观察对象（Observable），
  /// Getx会自动将其所有属性都转换为可观察属性（Observable）。
  /// 这意味着，无论是直接在GetxController中定义的属性，
  /// 还是在其内部嵌套的对象中定义的属性，
  /// 只要它们被定义为可观察属性，GetxController都会监听它们的变化。
  final state = MainState();

  /// 方法
  // 拉取数据
  asyncLoadAllData() async {
    print('开始拉取数据');
    state.categories = await newsRepository.categories(cacheDisk: true);
    state.channels = await newsRepository.channels(cacheDisk: true);
    // 分类对应的数据（推荐、新闻）
    state.newsRecommend = await newsRepository.newsRecommend(cacheDisk: true);
    state.newsPageList = await newsRepository.newsPageList(cacheDisk: true);
    // 所选分类
    state.selCategoryCode = state.categories?.first.code;
  }

  // 拉取推荐、新闻
  asyncLoadNewsData(
    categoryCode, {
    bool refresh = false,
  }) async {
    state.selCategoryCode = categoryCode;
    state.newsRecommend = await newsRepository.newsRecommend(
      params: NewsRecommendRequest(categoryCode: categoryCode),
      refresh: refresh,
      cacheDisk: true,
    );
    state.newsPageList = await newsRepository.newsPageList(
      params: NewsPageListRequest(categoryCode: categoryCode),
      refresh: refresh,
      cacheDisk: true,
    );
  }

  /// 生命周期
  @override
  void onReady() {
    super.onReady();
    // 异步拉取数据
    asyncLoadAllData();
  }
}
