console.log(countries)
// alert('Open the console and check if the countries has been loaded')

// Exercises: Level 1
// 1) Create an empty object called dog

var dog = {};

// 2) Print the the dog object on the console

console.log(dog);

// 3) Add name, legs, color, age and bark properties for the dog object. The bark property is a method which return woof woof

dog.name = "inu";
dog.legs = 4;
dog.color = "blue";
dog.age = 5;
dog.bark = function(){
    return "woof woof";
};

// 4) Get name, legs, color, age and bark value from the dog object
console.log(dog.name);
console.log(dog.legs);
console.log(dog.color);
console.log(dog.age);
console.log(dog.bark());


// 5) Set new properties the dog object: breed, getDogInfo
dog.breed = "shiba inu";
dog.getDogInfo = function(){};

// Exercises: Level 2

const users = {
    Alex: {
      email: 'alex@alex.com',
      skills: ['HTML', 'CSS', 'JavaScript'],
      age: 20,
      isLoggedIn: false,
      points: 30
    },
    Asab: {
      email: 'asab@asab.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'Redux', 'MongoDB', 'Express', 'React', 'Node'],
      age: 25,
      isLoggedIn: false,
      points: 50
    },
    Brook: {
      email: 'daniel@daniel.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'React', 'Redux'],
      age: 30,
      isLoggedIn: true,
      points: 50
    },
    Daniel: {
      email: 'daniel@alex.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'Python'],
      age: 20,
      isLoggedIn: false,
      points: 40
    },
    John: {
      email: 'john@john.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'React', 'Redux', 'Node.js'],
      age: 20,
      isLoggedIn: true,
      points: 50
    },
    Thomas: {
      email: 'thomas@thomas.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'React'],
      age: 20,
      isLoggedIn: false,
      points: 40
    },
    Paul: {
      email: 'paul@paul.com',
      skills: ['HTML', 'CSS', 'JavaScript', 'MongoDB', 'Express', 'React', 'Node'],
      age: 20,
      isLoggedIn: false,
      points: 40
    }
  };



// 1) Find the person who has many skills in the users object.

var persons = Object.entries(users);

var count = 0;
var person = "";

for(var i = 0; i < persons.length; i++)
{
    if(persons[i][1].skills.length>count)
    {
        count = persons[i][1].skills.length;
        person = persons[i][0];
    }
}
console.log(person + "is the person who has many skills in the users object");

// 2) Count logged in users, count users having greater than equal to 50 points from the following object.

count = 0;
for(var i = 0; i < persons.length; i++)
{
    if(persons[i][1].isLoggedIn == true)
    {
        count ++;
    }
}
console.log(count+" logged in users");

count = 0;
for(var i = 0; i < persons.length; i++)
{
    if(persons[i][1].points > 50)
    {
        count ++;
    }
}
console.log(count+" users having greater to 50 points from the following object");

count = 0;
for(var i = 0; i < persons.length; i++)
{
    if(persons[i][1].points == 50)
    {
        count ++;
    }
}
console.log(count+" users having equal to 50 points from the following object");



// 3) Find people who are MERN stack developer from the users object

function isMERN(skills)
{
    var mern = ['MongoDB', 'Express', 'React', 'Node'];
    for(var i = 0; i < mern.length; i++)
    {
        if(skills.indexOf(mern[i])==-1)
        {
            return false;
        }
    }
    return true;
}

var mern = [];
for(var i = 0; i < persons.length; i++)
{
    if(isMERN(persons[i][1].skills)==true)
    {
        mern.push(persons[i][0]);
    }
}
console.log(mern, "are the mern dev");

// 4) Set your name in the users object without modifying the original users object
users.Faliana = Object.assign({}, users.Paul);
console.log(users.Faliana);

// 5) Get all keys or properties of users object
console.log(Object.keys(users));

// 6) Get all the values of users object
console.log(Object.values(users));

// 7) Use the countries object to print a country name, capital, populations and languages.
console.log("print a country name: ", countries[0].name);
console.log("print a country capital: ", countries[0].capital);
console.log("print a country populations: ", countries[0].population);
console.log("print a country languages: ", countries[0].languages);

// Exercises: Level 3

//     1) Create an object literal called personAccount. It has firstName, lastName, incomes, 
//      expenses properties and it has totalIncome, totalExpense, accountInfo,addIncome, addExpense and accountBalance methods. 
//      Incomes is a set of incomes and its description and expenses is a set of incomes and its description.

        var personAccount = {
            firstName: "",
            lastName: "",
            incomes: 0,
            expenses: 0,
            totalIncome: function(){},
            totalExpense: function(){},
            accountInfo: function(){},
            addIncome: function(){},
            addExpense: function(){},
            accountBalance: function(){}
        };
        console.log(personAccount);

//     2) **** Questions:2, 3 and 4 are based on the following two arrays:users and products ()

const users2 = [
    {
        _id: 'ab12ex',
        username: 'Alex',
        email: 'alex@alex.com',
        password: '123123',
        createdAt:'08/01/2020 9:00 AM',
        isLoggedIn: false
    },
    {
        _id: 'fg12cy',
        username: 'Asab',
        email: 'asab@asab.com',
        password: '123456',
        createdAt:'08/01/2020 9:30 AM',
        isLoggedIn: true
    },
    {
        _id: 'zwf8md',
        username: 'Brook',
        email: 'brook@brook.com',
        password: '123111',
        createdAt:'08/01/2020 9:45 AM',
        isLoggedIn: true
    },
    {
        _id: 'eefamr',
        username: 'Martha',
        email: 'martha@martha.com',
        password: '123222',
        createdAt:'08/01/2020 9:50 AM',
        isLoggedIn: false
    },
    {
        _id: 'ghderc',
        username: 'Thomas',
        email: 'thomas@thomas.com',
        password: '123333',
        createdAt:'08/01/2020 10:00 AM',
        isLoggedIn: false
    }
    ];

    const products = [
  {
    _id: 'eedfcf',
    name: 'mobile phone',
    description: 'Huawei Honor',
    price: 200,
    ratings: [
      { userId: 'fg12cy', rate: 5 },
      { userId: 'zwf8md', rate: 4.5 }
    ],
    likes: []
  },
  {
    _id: 'aegfal',
    name: 'Laptop',
    description: 'MacPro: System Darwin',
    price: 2500,
    ratings: [],
    likes: ['fg12cy']
  },
  {
    _id: 'hedfcg',
    name: 'TV',
    description: 'Smart TV:Procaster',
    price: 400,
    ratings: [{ userId: 'fg12cy', rate: 5 }],
    likes: ['fg12cy']
  }
]

// Imagine you are getting the above users collection from a MongoDB database. 

// a. Create a function called signUp which allows user to add to the collection. If user exists, inform the user that he has already an account.
    
    function signUp(username, email, password)
    {
        var user = {};
        user._id = "random";
        user.username = username;
        user.email = email;
        user.password = password;
        user.createdAt = new Date();
        user.isLoggedIn = false;
        if(checkExistedUser(username, password)==false)
        {
            users2.push(user);
        }
        else
        {
            alert(username+" already an account");
        }
        
    }
    function checkExistedUser(username, password)
    {
        for(var i = 0; i < users2.length; i++)
        {
            if(users2[i].username == username || users2[i].password == password)
            {
                return true;
            }
        }
        return false;
    }
    signUp("poupoussy", "poupoussy@gmail.com", "poupoussypoupoussy");
    console.log(users2);

    // signUp("Alex", "poupoussy@gmail.com", "poupoussypoupoussy");

// b. Create a function called signIn which allows user to sign in to the application
function signIn(email, password)
{
    for(var i = 0; i < users2.length; i++)
    {
        if(users2[i].email==email && users2[i].password==password)
        {
            return "logged in";
        }
    }
    return "wrong email or password";
}
console.log(signIn("poupoussy@gmail.com", "poupoussy"));
console.log(signIn("poupoussy@gmail.com", "poupoussypoupoussy"));



// 3) The products array has three elements and each of them has six properties.

// a. Create a function called rateProduct which rates the product 
function rateProduct(product, user, rate)
{
    product.ratings.push({userId: user._id, rate: rate});
}
// console.log("alala", users2[5]);
rateProduct(products[0], users2[5], 3.69);
console.log(products);

// b. Create a function called averageRating which calculate the average rating of a product
function averageRating(product)
{
    var count = 0;
    for(var i = 0; i < product.ratings.length; i++)
    {
        count += product.ratings[i].rate;
    }
    return count/product.ratings.length;
}
console.log("averageRating", averageRating(products[0]))

// 4) Create a function called likeProduct. This function will helps to like to the product if it is not liked and remove like if it was liked.
function likeProduct(product, user){
    if(product.likes.indexOf(user._id)==-1 || product.likes.length==0)
    {
        product.likes.push(user._id);
    }
    else
    {
        product.likes.splice(product.likes.indexOf(user._id), 1);
    }
    // console.log(product.likes);
}
likeProduct(products[0], users2[5]);
console.log("ajout like", products[0]);
likeProduct(products[0], users2[5]);
console.log("delete like", products[0]);