import 'package:workouttest_util/model/cache.dart';
import 'package:workouttest_util/model/exercise.dart';
import 'package:workouttest_util/model/exercise_plan_detail.dart';
import 'package:workouttest_util/model/exercise_type.dart';
import 'package:workouttest_util/repository/training_plan_day_repository.dart';
import 'package:workouttest_util/util/logging.dart';

class CustomerTrainingPlanDetails with Logging {
  /// customerTrainingPlanDetails
  int? customerTrainingPlanDetailsId;

  /// trainingPlanDetailsId
  int? trainingPlanDetailsId;

  /// exerciseTypeId
  int? exerciseTypeId;

  /// set
  int? set;

  /// repeats
  int? repeats;

  /// weight
  double? weight;

  int? restingTime;
  bool? parallel;
  String? day;

  int? dayId;

  /// exerciseType
  ExerciseType? exerciseType;

  ExercisePlanDetailState state = ExercisePlanDetailState.start;

  List<Exercise> exercises = [];

  bool isTest = false;

  double baseOneRepMax = -1;

  List<ExerciseType> alternatives = [];

  CustomerTrainingPlanDetails();

  CustomerTrainingPlanDetails.fromJson(Map json) {
    customerTrainingPlanDetailsId = json['customerTrainingPlanDetailsId'];
    exerciseTypeId = json['exerciseTypeId'];
    set = json['set'];
    repeats = json['repeats'];
    weight = json['weight'];
    restingTime = json['restingTime'];
    parallel = json['parallel'];
    day = json['day'];
  }

  CustomerTrainingPlanDetails.fromJsonWithExerciseList(Map json) {
    customerTrainingPlanDetailsId = json['customerTrainingPlanDetailsId'] == "null" || json['customerTrainingPlanDetailsId'] == null
        ? 0
        : json['customerTrainingPlanDetailsId'];
    trainingPlanDetailsId = json['trainingPlanDetailsId'] == "null" ? 0 : json['trainingPlanDetailsId'];
    exerciseTypeId = json['exerciseTypeId'];
    set = json['set'];
    repeats = json['repeats'] == "null" ? -1 : json['repeats'];
    weight = json['weight'] == "null" ? 0 : json['weight'];
    restingTime = json['restingTime'];
    parallel = json['parallel'] == "false"
        ? false
        : json['parallel'] == "true"
            ? true
            : null;
    dayId = json['dayId'] == "null" ? null : json['dayId'];
    TrainingPlanDayRepository trainingPlanDayRepository = const TrainingPlanDayRepository();
    day = trainingPlanDayRepository.getNameById(dayId);

    try {
      Iterable iterable = json['exercises'];
      exercises = iterable.map((exercise) => Exercise.fromJson(exercise)).toList();
    } on Exception catch (e) {
      log("JsonDecode error $e");
    }

    if (json['state'] == ExercisePlanDetailState.finished.toStr()) {
      state = ExercisePlanDetailState.finished;
    } else if (json['state'] == ExercisePlanDetailState.inProgress.toStr()) {
      state = ExercisePlanDetailState.inProgress;
    } else if (json['state'] == ExercisePlanDetailState.skipped.toStr()) {
      state = ExercisePlanDetailState.skipped;
    } else {
      state = ExercisePlanDetailState.start;
    }
    isTest = json['isTest'] == "true" ? true : false;

    exerciseType = Cache().getExerciseTypeById(exerciseTypeId!);

    baseOneRepMax = json['baseOneRepMax'] ?? 0;
  }

  ExerciseType? getExerciseType() => exerciseType;

  Map<String, dynamic> toJson() => {
        "customerTrainingPlanDetailsId": customerTrainingPlanDetailsId,
        "exerciseTypeId": exerciseTypeId,
        "set": set,
        "repeats": repeats,
        "weight": weight,
        "restingTime": restingTime,
        "parallel": parallel,
        "day": day ?? '1.',
      };

  Map<String, dynamic> toJsonWithExercises() {
    final Map<String, dynamic> jsonMap = {
      "customerTrainingPlanDetailsId": customerTrainingPlanDetailsId,
      "trainingPlanDetailsId": trainingPlanDetailsId,
      "exerciseTypeId": exerciseTypeId,
      "set": set,
      "repeats": repeats,
      "weight": weight,
      "restingTime": restingTime,
      "parallel": parallel,
      'exercises': exercises.isEmpty ? [].toString() : exercises.map((exercise) => exercise.toJson()).toList().toString(),
      'state': state.toStr(),
      "isTest": isTest,
      "dayId": dayId,
      "baseOneRepMax": baseOneRepMax,
    };

    //print("Detail toJson $jsonMap");
    return jsonMap;
  }

  @override
  String toString() => toJsonWithExercises().toString();

  void copy(CustomerTrainingPlanDetails from) {
    customerTrainingPlanDetailsId = from.customerTrainingPlanDetailsId;
    trainingPlanDetailsId = from.trainingPlanDetailsId;
    exerciseTypeId = from.exerciseTypeId;
    exerciseType = from.exerciseType;
    set = from.set;
    repeats = from.repeats;
    weight = from.weight;
    restingTime = from.restingTime;
    parallel = from.parallel;
    exercises = from.exercises;
    state = from.state;
    isTest = from.isTest;
    day = from.day;
    dayId = from.dayId;
    baseOneRepMax = from.baseOneRepMax;
    if (from.exercises.isEmpty) {
      exercises = [];
    }
    if (from.alternatives.isNotEmpty) {
      for (var alternative in from.alternatives) {
        alternatives.add(alternative);
      }
    }
  }
}