<commit_before>import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/of';

import { Photo, Question } from './quizz.model';

/**
 * This class provides the Quizz service with methods to create and submit quizz.
 */
@Injectable()
export class QuizzService {

  quizzMap: Map<string, number>;
  private data = ['Gorille', 'Chimpanzé', 'Orang-outang', 'Ouistiti'];

  constructor() {
    this.quizzMap = new Map<string, number>();
  }

  getQuestionIndex(id: string): number {
    console.log(`getQuestionIndex(${id})`);
    return this.quizzMap.has(id) ? this.quizzMap.get(id) : 0;
  }

  getQuestion(id: string, index: number): Question {
    console.log(`getQuestion(${id}, ${index})`);
    this.shuffle();
    var question: Question = { responses: this.data };
    return question;
  }

  getPhoto(id: string, index: number): Observable<Photo> {
    console.log(`getPhoto(${id}, ${index})`);
    const photo: Photo = {
      url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Gorilla_gorilla_gorilla8.jpg/1024px-Gorilla_gorilla_gorilla8.jpg',
      attribution: 'Par Raul654, license CC by-sa (https://creativecommons.org/licenses/by-sa/3.0/deed.fr)'
    };
    return Observable.of(photo);
  }

  addResponse(id: string, response: string): boolean {
    console.log(`addResponse(${id}, ${response})`);
    const idx = this.quizzMap.get(id) || 0;
    this.quizzMap.set(id, idx + 1);
    return true;
  }

  private shuffle() {
    for (let i = this.data.length - 1; i > 0; i--) {
      let j = Math.floor(Math.random() * (i + 1));
      const temp = this.data[i];
      this.data[i] = this.data[j];
      this.data[j] = temp;
    }
    return this.data;
  }
}
<commit_msg>Let's go next exercise<commit_after>
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/of';

import { Quizz, QuizzResponses, QuizzResult, Photo, Question } from './quizz.model';

/**
 * QuizzService.
 * Utilise Http pour les accés HTTP en AJAX
 * Utilise Storage pour stocker les données
 */
// TODO Rendre ce service Injectable
export class QuizzService {

  /**
   * Méthode statique utilitaire pour le traitement des erreurs HTTP
   */
  private static handleError(error: any) {
    const errMsg = (error.message) ? error.message :
      error.status ? `${error.status} - ${error.statusText}` : 'Server error';
    console.error(errMsg); // log dans la console
    return Observable.throw(errMsg); // Lance une erreur
  }

  /**
   * Créer un nouveau QuizzService avec les services Http et Storage injectés.
   * @param {Http} http - Le service Http injecté.
   * @param {Storage} storage - Le service Storage injecté.
   * @constructor
   */
  constructor(
    private http: Http,
    private storage: Storage) {
  }

  create(name: string): Observable<Quizz> {
    const setCurrentQuizz = (quizz:Quizz) => {
        this.setQuizz(quizz);
        this.setQuizzResponses(quizz.id, new QuizzResponses());
        return quizz;
    };
    // TODO utiliser le service Http pour faire le GET api/quizz?userName= pour créer le quizz
    // TODO utiliser la fonction map des Observables et setCurrentQuizz
    // TODO utiliser QuizzService.handleError pour traiter les éventuelles erreurs
    return Observable.throw('A implémenter');
  }

  getQuestionIndex(id: string): number {
    const resp = this.getQuizzResponses(id);
    return resp.responses.length;
  }

  getQuestion(id: string, index: number): Question {
    return this.getQuizz(id).questions[index];
  }

  getResult(id: string): QuizzResult {
    return this.getQuizzResult(id);
  }

  getPhoto(id: string, index: number): Observable<Photo> {
    // TODO utiliser le service Http pour faire le GET api/quizz/id/index pour récupérer la photo
    // TODO utiliser la fonction map pour retourner la photo
    // TODO utiliser QuizzService.handleError pour traiter les éventuelles erreurs
    return Observable.throw('A implémenter');
  }

  addResponse(id: string, response: string): boolean {
    const resp = this.getQuizzResponses(id);
    resp.responses.push(response);
    this.setQuizzResponses(id, resp);
    // continuer s'il y a pas d'autres questions
    return resp.responses.length !== this.getQuizz(id).questions.length;
  }

  sendResponses(id: string): Observable<QuizzResult> {
    // TODO utiliser le service Http pour faire le POST api/quizz/id pour envoyer les réponses
    // TODO utiliser la fonction map pour retourner le résultat, il faut aussi enregistrer le résultat avec setQuizzResult
    // TODO utiliser QuizzService.handleError pour traiter les éventuelles erreurs
    return Observable.throw('A implémenter');
  }

  private getQuizz(id: string): Quizz {
    return JSON.parse(this.storage.getItem(`quizz-${id}`)) as Quizz;
  }

  private setQuizz(quizz: Quizz) {
    this.storage.setItem(`quizz-${quizz.id}`, JSON.stringify(quizz));
  }

  private getQuizzResponses(id: string): QuizzResponses {
    return JSON.parse(this.storage.getItem(`responses-${id}`)) as QuizzResponses;
  }

  private setQuizzResponses(id: string, quizzResponses: QuizzResponses) {
    this.storage.setItem(`responses-${id}`, JSON.stringify(quizzResponses));
  }
  private getQuizzResult(id: string): QuizzResult {
    return JSON.parse(this.storage.getItem(`result-${id}`)) as QuizzResult;
  }

  private setQuizzResult(id: string, quizzResult: QuizzResult) {
    this.storage.setItem(`result-${id}`, JSON.stringify(quizzResult));
  }
}

{'fraction_non_alphanumeric': 0.13168507802910748, 'fraction_numerical': 0.0033315798702437316, 'mean_word_length': 3.7454242928452577, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 11, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4101918', 'n_tokens_mistral': 1876, 'n_tokens_neox': 1857, 'n_words': 467}