import 'package:comunic/models/survey_choice.dart';
import 'package:comunic/utils/account_utils.dart' as account;
import 'package:meta/meta.dart';

/// Survey information
///
/// @author Pierre HUBERT

class Survey {
  final int id;
  final int userID;
  final int postID;
  final int creationTime;
  final String question;
  int userChoice;
  final Set<SurveyChoice> choices;
  bool allowNewChoicesCreation;

  Survey({
    @required this.id,
    @required this.userID,
    @required this.postID,
    @required this.creationTime,
    @required this.question,
    @required this.userChoice,
    @required this.choices,
    @required this.allowNewChoicesCreation,
  })  : assert(id != null),
        assert(userID != null),
        assert(postID != null),
        assert(creationTime != null),
        assert(question != null),
        assert(userChoice != null),
        assert(choices != null),
        assert(choices.length > 0),
        assert(allowNewChoicesCreation != null);

  bool get hasResponded => this.userChoice != null && this.userChoice > 0;

  bool get hasResponses =>
      this.choices.where((f) => f.responses > 0).length > 0;

  bool get canBlockNewChoicesCreation =>
      allowNewChoicesCreation && account.userID() == this.userID;

  SurveyChoice get userResponse {
    if (!hasResponded) return null;

    return choices.firstWhere((e) => e.id == userChoice);
  }

  void cancelUserResponse() {
    if (hasResponded) userResponse.responses--;
    userChoice = 0;
  }

  void setUserResponse(SurveyChoice choice) {
    cancelUserResponse();
    userChoice = choice.id;
    choice.responses++;
  }
}