from OrderedPair import OrderedPair
import math

class ComplexOrderedPair(OrderedPair):
    """x = real part, y = imaginary part of a + bi.
    Inherits from OrderedPair; overrides __str__; adds conjugate/modulus."""

    def __init__(self, real=0.0, imaginary=0.0):
        """Default + two-parameter constructor via default params."""
        super().__init__(real, imaginary)   # calls OrderedPair.__init__
        self._label = "z"
        print("...ComplexOrderedPair constructor...")

    @classmethod
    def from_complex(cls, orig):
        """Copy constructor for ComplexOrderedPair."""
        print("...ComplexOrderedPair copy constructor (classmethod)...")
        instance        = cls(orig.get_x(), orig.get_y())
        instance._label = orig.get_label()
        return instance

    # Override __str__ — shows a+bi instead of (a, b)
    def __str__(self):
        r = self.get_x()
        i = self.get_y()
        if i == 0:   return str(r)
        if r == 0:   return str(i) + "i"
        if i > 0:    return str(r) + " + " + str(i) + "i"
        return str(r) + " - " + str(abs(i)) + "i"

    # New methods added by the subclass
    def conjugate(self):
        """Return the complex conjugate (flip sign of imaginary part)."""
        print("...conjugate...")
        return ComplexOrderedPair(self.get_x(), -self.get_y())

    def modulus(self):
        """Alias for get_abs_val(), named appropriately for complex numbers."""
        return self.get_abs_val()

#end class ComplexOrderedPair
