def meeting_participate_show(current_user, hash_id):
  meeting_id = Meeting.get_id(hash_id)

  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  participate = Participate.query.get((current_user.id, meeting_id))

  if participate:
    return jsonify({'participate': True, 'message': 'Already participated this meeting'}), 200

  return jsonify({'participate': False, 'message': 'Didn\'t participate'}), 200
def meeting_final_vote_show(hash_id):
  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  return jsonify(meeting.final_slots), 200
def meeting_show(hash_id):
  meeting = Meeting.query.get(Meeting.get_id(hash_id))
  vote_slots = calculate_vote_slots(meeting)
  meeting_serialize = meeting.serialized
  meeting_serialize['vote_slots'] = vote_slots
  meeting_serialize['max_vote'] = caluculate_max_vote_slots(vote_slots)

  return jsonify(meeting_serialize), 200
def meeting_participate_destroy(current_user, hash_id):
  meeting_id = Meeting.get_id(hash_id)

  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  participate = Participate.query.get((current_user.id, meeting_id))

  if not participate:
    return jsonify({'message': 'Didn\'t participate'}), 400

  db.session.delete(participate)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200
def meeting_reference(hash_id):
  meeting_id = Meeting.get_id(hash_id)
  meeting = Meeting.query.get(meeting_id)

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  references = [reference.serialized for reference in meeting.references]
  return jsonify(references), 200
def meeting_participate_create(current_user, hash_id):
  meeting_id = Meeting.get_id(hash_id)

  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  participate = Participate.query.get((current_user.id, meeting_id))

  if participate:
    return jsonify({'message': 'Already participated this meeting'}), 400

  participate = Participate(user_id=current_user.id, meeting_id=meeting_id, vote_slots=[])
  db.session.add(participate)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200
def meeting_vote_show(current_user, hash_id):
  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  participate = Participate.query.get((current_user.id, meeting.id))

  if not participate:
    return jsonify({'message': 'Didn\'t participate'}), 400

  return jsonify(participate.serialized), 200
def meeting_destroy(current_user, hash_id):
  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  if meeting.host_id != current_user.id:
    return jsonify({'message': 'Forbidden (host_id not correct)'}), 403

  db.session.delete(meeting)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200
def meeting_final_vote(current_user, hash_id):
  req = request.get_json(force=True)
  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  meeting.final_slots = req['final_slots']

  db.session.add(meeting)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200
def meeting_reference_create(hash_id):
  meeting_id = Meeting.get_id(hash_id)
  meeting = Meeting.query.get(meeting_id)

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  req = request.get_json(force=True)
  reference = Reference(meeting_id=meeting_id, title=req['title'], link=req['link'])

  db.session.add(reference)
  db.session.commit()

  return jsonify({'message': 'Success', 'id': reference.id}), 200
def meeting_vote(current_user, hash_id):
  req = request.get_json(force=True)
  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  participate = Participate.query.get((current_user.id, meeting.id))

  if not participate:
    return jsonify({'message': 'Didn\'t participate'}), 400

  participate.vote = False if len(req['vote_slots']) == 0 else True
  participate.vote_slots = req['vote_slots']

  db.session.add(participate)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200
def meeting_create(current_user):
  req = request.get_json(force=True)

  meeting = Meeting(
              host_id=current_user.id,
              title=req['title'],
              description=req['description'],
              meeting_link=req['meeting_link'],
              location=req['location'],
              start_hour=int(req['start_hour']),
              end_hour=int(req['end_hour']),
              final_slots=[]
  )
  db.session.add(meeting)
  db.session.commit()

  participate = Participate(user_id=current_user.id, meeting_id=meeting.id, vote_slots=[])
  db.session.add(participate)
  db.session.commit()

  return jsonify({'hash_id': meeting.hash_id, 'message': 'Success'}), 200
def meeting_update(current_user, hash_id):
  req = request.get_json(force=True)

  meeting = Meeting.query.get(Meeting.get_id(hash_id))

  if not meeting:
    return jsonify({'message': 'Meeting not found'}), 404

  if meeting.host_id != current_user.id:
    return jsonify({'message': 'Forbidden (host_id not correct)'}), 403

  meeting.title = req['title']
  meeting.description = req['description']
  meeting.meeting_link = req['meeting_link']
  meeting.location = req['location']
  meeting.start_hour = int(req['start_hour'])
  meeting.end_hour = int(req['end_hour'])
  # TODO
  # meeting.final_slots=[]

  db.session.add(meeting)
  db.session.commit()

  return jsonify({'message': 'Success'}), 200