console.log("Hello B322!");

// [SECTION] Arithmetic Operators

let x = 1397;
let y = 7831;

let sum = x + y;
console.log("Result of addition operator: " + sum);

let difference = x - y;
console.log("Result of subtraction operator: " + difference);

let product = x * y;
console.log("Result of multiplication operator: " + product);

let quotient = x / y; 
console.log("Result of division operator: " + quotient);

let remainder = y % x;
console.log("Result of modulo operator: " + remainder);

// [SECTION] Assignment Operators

// Basic Assignment Operator (=)
// The assignment operator assigns the value of the **right** operand to a variable.
let assignmentNumber = 8

// Addition Assignment Operator (+=)
// The addition assignment operator adds the value of the right operand to a variable and assigns the result to the variable.

assignmentNumber = assignmentNumber + 2;
console.log("Result of addition assignment operators: " + assignmentNumber);

assignmentNumber += 2;
console.log("Result of addition assignment operator: " + assignmentNumber);

// Subtraction/Multiplication/Division Assignment Operator (-=,*=,/=);

assignmentNumber -= 2;
console.log("Result of subtraction assignment operator: " + assignmentNumber);

assignmentNumber *= 2; 
console.log("Result of multiplication assignment operator: " + assignmentNumber);

assignmentNumber /= 2;
console.log("Result of division assignment operator: " + assignmentNumber);


// Multiple Operators 

let mdas = 1 + 2 - 3 * 4 / 5;
console.log("Result of mdas operation: " + mdas);

/*
1. 3 * 4 = 12
2. 12 / 5 = 2.4
3. 1 + 2 = 3
4. 3 = 2.4 = 0.6
*/

// pemdas
let pemdas = 1 + (2 - 3) * (4 / 5);
console.log("Result of pemdas operation: " + pemdas);

// The operations were done in the following order 
/*
1. 4/5 = -0.8
2. 2-3 = -1 
3. 1 + -1 = 0
4. 0 * 0.8 = 0
*/

// Increment and Decrement
// Operators that add or subtract values by 1 and reassigns the value of the variable where it was added to. 
let z = 1; 
// The value of "z" is added by a value of one before returning the value and storing it in the variable "increment"
let increment = ++z;
console.log("Result of pre-increment: " + increment);
// The value of "z" was also increased even though we didn't implicitly specify any value reassignment.
console.log("Result of pre-increment: " + z);


// The value of "z" is returned and stored in the variable "increment" then the value of "z" is increased by one increment 
increment = z++;
// The value of "z" is at 2 before it was incremented
console.log ("Result of post-increment: " + increment);
// The value of "z" was increased again reassigning the value to 3
console.log("Result of post-increment: " + z);

let decrement = --z;

console.log("Result of pre-decrement: " + decrement);

console.log("Result of pre-decrement: " + z);

decrement = z--;

console.log("Result of post-decrement: " + decrement);

console.log("Result of post-decrement: " + z);


// Coercion 
// Type coercion is the automatic or implicit conversion of values from one data type to another 
// This happens when operations are performed on different data types that would normally not be possible and yield irregular results
// Values are automatically converted from one data type to another in order to resolve operations

let numA = '10';
let numB = 12;

// Adding/concatenating a string and a number will result in a string
// This can be proven in the console by looking at the color of the text displayed 
// Black text means that the output returned is a string data type.

let coercion = numA + numB;
console.log(coercion);
console.log(typeof coercion);


let numC = 16;
let numD = 14;

let nonCoercion = numC + numD;
console.log(nonCoercion);
console.log(typeof nonCoercion);

let numE = true + 1;
console.log(numE);

let numF = false + 1;
console.log(numF);
console.log(typeof numF);

// [SECTION] Comparison Operators

// Equality Operator (==)
// - checks whether the operands are equal/have the same content
// - it returns a boolean value

let juan = 'juan';

console.log(1 == 1);
console.log(1 == 2);
console.log(1 == '1');
console.log('juan' == 'juan');
console.log('juan' == juan);

// Inequality Operator (!=)
// -checks wheter the operands are not equal/have different content

console.log(1 != 1);
console.log(1 != 2);
console.log(1 != '1');
console.log('juan' != 'juan');
console.log('juan' != juan);

// Strict Equality Operator
// Checks whether the operands are equal/have the same content
// Also COMPARES the data types of 2 values.
console.log(1 === 1);
console.log(1 === 2);
console.log(1 === '1');
console.log('juan' === 'juan');
console.log('juan' === juan);

// Strict Inequality Operator
// Checks whether the operands are not equal/have the same content
// Also COMPARES the data types of 2 values
console.log(1 !== 1);
console.log(1 !== 2);
console.log(1 !== '1');
console.log('juan' !== 'juan');
console.log('juan' !== juan);

// Relational Operators

// Some comparison operators check whether one value is greater or less than to other value

let a = 50;
let b = 65; 

// GT or Greater Than operator ( > )
let isGreaterThan = a > b;

// LT or Less Than operator ( < )
let isLessThan = a < b;

// GTE or Greater Than or Equal Operator ( >= )
let isGTorEqual = a >= b;

// LTE or Less Than or Equal Operator ( <= )
let isLTorEqual = a <= b;

console.log(isGreaterThan);
console.log(isLessThan);
console.log(isGTorEqual);
console.log(isLTorEqual);

let numStr = "30";
console.log(a > numStr); 
// Coercion - forced coercion to change the string to a number.

console.log(b <= numStr);

let str = "twenty";
console.log(b >= str);

// This results to NaN. 

// Logical Operators

let isLegalAge = true;
let isRegistered = false;

// Logical And Opertaor (&& - Double Ampersand)
// Returns true if all operands true 

let allRequirementsMet = isLegalAge && isRegistered;
console.log("Result of logical AND Operator: " + allRequirementsMet);


// Logical Or Operator (|| - Double Pipe)
// Returns true if one of the operands are true
let someRequirementsMet = isLegalAge || isRegistered;
console.log("Result of logical OR Operator: " + someRequirementsMet);

// Logical Not Operator (! - Exclamation Point)
// Returns the opposite value
let someRequirementsNotMet = !isRegistered;
console.log("Result of logical NOT Operator: " + someRequirementsNotMet);