"""This module defines the Vector class. """
import logging
from math import acos, sqrt


logger = logging.getLogger(__name__)


class Vector(object):
    def __init__(self, x, y, z):
        """Constructor method."""
        self.x = x
        self.y = y
        self.z = z

    def dot(self, v):
        """Returns the dot product with Vector *v*."""
        if not isinstance(v, self.__class__):
            msg = f"Expected an instance of {self.__class__}, but got {type(v)} instead."
            raise ValueError(msg)
        d = self.x * v.x + self.y * v.y + self.z * v.z
        return d

    def abs(self):
        """Returns the magnitude of the vector."""
        m = sqrt(self.x**2 + self.y**2 + self.z**2)
        return m

    def __repr__(self):
        s = "Vector(x=%s, y=%s, z=%s)" % (self.x, self.y, self.z)
        return s

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        z = self.z + other.z
        return self.__class__(x, y, z)

    def __mul__(self, other):
        if not isinstance(other, Vector):
            return NotImplemented
        x = self.y * other.z - self.z * other.y
        y = self.z * other.x - self.x * other.z
        z = self.x * other.y - self.y * other.x
        return self.__class__(x, y, z)


if __name__ == "__main__":
    v1 = Vector(3, 4, 0)
    print(v1, " magnitude is", v1.abs())
    v2 = Vector(1.0, 2.0, 3.0)
    print("v1.dot(v2) =", v1.dot(v2))

    assert v1.abs() == 5
    print("Tests passed!")