package controller;

import java.util.ArrayList;
import org.bson.types.ObjectId;
import model.Film;
import utils.ConnectToMongo;
import utils.ArrayListsFonctions;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

public class MongoControl {
	final static DBCollection coll = ConnectToMongo.getDB().getCollection("films");
	
	public static ArrayList<Film> getFilms(){
		final DBCursor results = coll.find().sort(new BasicDBObject("titre", 1));
		ArrayList<Film> films = new ArrayList<>();
		while (results.hasNext()) {
		    final DBObject dbObject = results.next();
		    final Object id = dbObject.get("_id");
		    final Object titre = dbObject.get("titre");
		    final Object annee = dbObject.get("annee");
		    final Object note = dbObject.get("note");
		    //gestion de plusieurs occurences dans le champ genre
		    ArrayList<String> genreList = new ArrayList<>();
		    genreList = ArrayListsFonctions.fillArray(dbObject.get("genre"), genreList);
		    
		    ArrayList<String> natioList = new ArrayList<>();
		    natioList = ArrayListsFonctions.fillArray(dbObject.get("natio"), natioList);
		    
		    Film f = new Film();
		    f.setId(id.toString());
		    f.setTitre(titre.toString());
		    if(annee == null){
		    	f.setAnnee("");
		    } else {
		    	f.setAnnee(annee.toString().substring(0, 4));
		    }
		    if(genreList.size() == 0){
		    	f.setGenre("");
		    } else {
				f.setGenre(ArrayListsFonctions.parseArray(genreList));
		    }  
		    if(natioList.size() == 0){
		    	f.setNatio("");
		    } else {
		    	f.setNatio(ArrayListsFonctions.parseArray(natioList));
		    }    
		    if(note == null){
		    	f.setNote(0);
		    } else {
		    	f.setNote(Double.parseDouble(note.toString()));
		    }
		    films.add(f);
		}
	    return films;
	}
	
	public static Film getFilmById(String id){
		DBObject searchById = new BasicDBObject("_id", new ObjectId(id));
		DBObject film = coll.findOne(searchById);
		
		Film f = new Film();
		f.setId(id);
		f.setTitre(film.get("titre").toString());
		if(film.get("note") == null){
			f.setNote(0);
		} else{
			f.setNote(Double.parseDouble(film.get("note").toString()));
		}
		if(film.get("annee") == null){
	    	f.setAnnee("");
	    } else {
	    	f.setAnnee(film.get("annee").toString().substring(0, 4));
	    }
		ArrayList<String> genreList = new ArrayList<>();
		genreList = ArrayListsFonctions.fillArray(film.get("genre"), genreList);
	    if(genreList.size() == 0){
	    	f.setGenre("");
	    } else {
			f.setGenre(ArrayListsFonctions.parseArray(genreList));
	    }
		ArrayList<String> natioList = new ArrayList<>();
	    natioList = ArrayListsFonctions.fillArray(film.get("natio"), natioList);
	    if(natioList.size() == 0){
	    	f.setNatio("");
	    } else {
			f.setNatio(ArrayListsFonctions.parseArray(natioList));
	    } 
	    return f;	    
	}
	
	// ****************METHODE POUR AJOUTER UN FILM***********************
	
	public static void ajoutFilm(String titre, String annee, String[] genreList, String[] natioList){	
		BasicDBObject film = new BasicDBObject();
		film.put("titre", titre);
		film.put("annee", Integer.parseInt(annee));
		film.put("genre", ArrayListsFonctions.arrayToBDBL(genreList));
		film.put("natio", ArrayListsFonctions.arrayToBDBL(natioList));
		coll.insert(film);
	}

	// ****************METHODE POUR MODIFIER UN FILM***********************
	
	public static void modifierFilm(Film f){
		BasicDBObject film = new BasicDBObject();
		film.put("titre", f.getTitre());
		film.put("annee", f.getAnnee());
		film.put("genre", f.getGenreList());
		film.put("natio", f.getNatioList());
		
		BasicDBObject updateObj = new BasicDBObject();
	    updateObj.put("$set", film);
		BasicDBObject searchQuery = new BasicDBObject("_id", new ObjectId(f.getId()));
		coll.update(searchQuery, updateObj);
	}
	
	// ****************METHODE POUR SUPPRIMER UN FILM***********************
	
	public static void deleteFilm(String id){
		coll.remove(new BasicDBObject().append("_id", new ObjectId(id)));
	}
	
	// ****************METHODE POUR VOTER POUR UN FILM***********************
	
	public static void addVote(String id, double note){
		Film f = MongoControl.getFilmById(id);
		BasicDBObject film = new BasicDBObject();
		
		if(f.getNote() == 0 || f.getNote() != 0){
			film.put("note", note);
		}
		BasicDBObject updateObj = new BasicDBObject();
	    updateObj.put("$set", film);
		BasicDBObject searchQuery = new BasicDBObject("_id", new ObjectId(f.getId()));
		coll.update(searchQuery, updateObj);
	}
		
}
