import 'package:rasadyar_auth/data/utils/safe_call.dart';
import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart';
import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';

class HomeLogic extends GetxController {
  RootLogic rootLogic = Get.find<RootLogic>();
  RxnInt totalWeightTodayBars = RxnInt();
  Rxn<InventoryModel> inventoryModel = Rxn<InventoryModel>();
  Rxn<KillHouseDistributionInfo> killHouseDistributionInfo = Rxn<KillHouseDistributionInfo>();


  @override
  void onInit() {
    super.onInit();
    getTodayBars();
    getInventory();
    getDistributionInformation();
  }

  Future<void> getTodayBars() async {
    await safeCall<BarInformation?>(
      call: () async => await rootLogic.chickenRepository.getGeneralBarInformation(
        token: rootLogic.tokenService.accessToken.value!,
        queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()),
      ),
      onSuccess: (result) {
        if (result != null) {
          totalWeightTodayBars.value = result.totalBarsWeight?.toInt();
        }
      },
      onError: (error, stackTrace) {
        switch (error.response?.statusCode) {
          case 401:
            errorHandler(error);
            break;
          case 403:
            errorHandler(error);
            break;
          default:
            errorHandler(error);
        }
      },
    );
  }

  Future<void> getInventory() async {
    await safeCall<List<InventoryModel>?>(
      call: () async => await rootLogic.chickenRepository.getInventory(token: rootLogic.tokenService.accessToken.value!),
      onSuccess: (result) {
        if (result != null) {
          inventoryModel.value = result.first;
        }
      },
      onError: (error, stackTrace) {
        switch (error.response?.statusCode) {
          case 401:
            errorHandler(error);
            break;
          case 403:
            errorHandler(error);
            break;
          default:
            errorHandler(error);
        }
      },
    );
  }

  Future<void> getDistributionInformation() async {
    await safeCall<KillHouseDistributionInfo?>(
      call: () async => await rootLogic.chickenRepository.getKillHouseDistributionInfo(token: rootLogic.tokenService.accessToken.value!),
      onSuccess: (result) {
        if (result != null) {
          killHouseDistributionInfo.value = result;
        }
      },
      onError: (error, stackTrace) {},
    );
  }


  void errorHandler(DioException error) {
    handleGeneric(error, () {
      rootLogic.tokenService.deleteTokens();
    });
  }

  @override
  void onReady() {
    super.onReady();
  }

  @override
  void onClose() {
    super.onClose();
  }
}
