// Crear usuario de tipo admin y asignar rol

db.createUser({
  user: "admin",
  pwd: "Test1234",
  roles: ["root"]
})

// Mostrar roles
db.getRoles({showBuiltinRoles: true})

// Crear rol

db.createRole({
	role: "procesarVentas", // Nombre del rol
	privileges: [ // Privilegios
    {
			resource: { db: "nuevaBBDD", collection: "ventas"}, // Recursos
			actions: ["find", "insert", "update"] // Acciones
		},
    {
			resource: { db: "nuevaBBDD", collection: "usuarios"},
			actions: ["find", "update"]
		},
    {
			resource: { db: "nuevaBBDD", collection: "productos"},
			actions: ["find", "update"]
		}
	],
	roles: []
})

// Comando para ver usuarios en mongo
db.getUsers()

// Crear usuario con rol
db.createUser({
	user: "consultor",
	pwd: "Test1234",
	roles: ["consultaProducto"]
})

// Eliminar roles
db.dropRole("nombreRol")

// Conexión por terminal con mongosh
// -u hacer referencia al usuario
// -p hacer referencia a la contraseña

mongosh -u "vendedor" -p "Test1234" --authenticationDatabase "admin"


/* ---------------------------------------------------- */

// Buscamos por nombre al usuario
const usuarioNuevo = db.usuarios.findOnde({ nombre: "María González"})

// Imprimimos los datos del usuario
print(usuarioNuevo)

// Buscamos por titulo la tarjeta
const tarjetaPorAsignar = db.tarjetas.findOne({titulo: "Configurar servidor"})

// Modificar la tarjeta asignando el usuario
db.tarjetas.updateOne(
  { _id: tarjetaPorAsignar._id},
  { $push: { usuariosAsignados: usuarioNuevo._id} }
)

// Elimina un usuario dentro de la tarjeta:

db.tarjetas.updateOne(
  { _id: tarjetaPorAsignar._id},
  { $pull: { usuariosAsignados: usuarioNuevo._id} }
)

// Pipeline
db.ventas.aggregate([
  {
		$lookup: {
			from: "productos",
			localField: "productoId",
			foreignField: "_id",
			as: "detalleProducto"
		}
	},
  {
		$unwind: "$detalleProducto"
	},
  {
		$group: {
			_id: { mes: { $month: "$fecha"}, anio: {$year: "$fecha"}},
			ingresos: {$sum: {$multiply: ["$cantidad", "$detalleProducto.precio"]}}
		}
	},
  {
		$sort: { "_id.anio": 1, "_id.mes": 1}
	}
])


// MapReduce
db.ventas.mapReduce(
	function() {
		var mes = this.fecha.getMonth() + 1;
		var anio = this.fecha.getFullYear();
		emit({mes: mes, anio: anio}, {productoId: this.productoId, cantidad: this.cantidad});
	},
	function(key, values){
		return Array.sum(values);
	},
	{
		out: {inline: 1}
	}
).results.forEach(venta => {
	var producto = db.productos.findOne({_id: venta.value.productoId})
	if (producto){
		print(`Mes: ${venta._id.mes}, Año: ${venta._id.anio}. Ingresos: ${venta.value * producto.precio} `)
	} else {
		print("No existe el producto")
	}
})