# Copyright 2022 Q-CTRL. All rights reserved.
#
# Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
# copying or use of this file, via any medium, is strictly prohibited.
# Proprietary and confidential. You may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#    https://q-ctrl.com/terms
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS. See the
# License for the specific language.
# pylint:disable=missing-module-docstring,too-many-ancestors
from typing import (
    Any,
    Dict,
)

from qctrl.builders.graphql_utils.handlers import NamedInputObjectHandler
from qctrl.builders.type_registry import TypeOverrideMixin


class ComplexNumberInputHandler(NamedInputObjectHandler, TypeOverrideMixin):
    """Custom handler for ComplexNumberInput."""

    _type_hint = complex
    _input_object_name = "ComplexNumberInput"

    def get_input_object_values(self, data: Dict[str, Any]):
        if isinstance(data, complex):
            real = data.real
            imag = data.imag

        elif isinstance(data, (int, float)):
            real = data
            imag = 0

        elif isinstance(data, dict):
            real = data.get("real", 0)
            imag = data.get("imag", 0)

        else:
            try:
                real = float(data)
            except (TypeError, ValueError) as error:
                raise TypeError(f"unknown type: {type(data)}, ({data})") from error
            else:
                imag = 0

        return {"real": real, "imag": imag}
