# coding: utf-8

"""
MoneyKit API

No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)

The version of the OpenAPI document: 2023-02-18
Generated by OpenAPI Generator (https://openapi-generator.tech)

Do not edit the class manually.
"""  # noqa: E501

from __future__ import annotations
import pprint
import re  # noqa: F401
import json


from typing import Any, ClassVar, Dict, List, Optional
from pydantic import BaseModel, StrictBool
from pydantic import Field

try:
    from typing import Self
except ImportError:
    from typing_extensions import Self


class MoneyKitConnectFeatures(BaseModel):
    """
    MoneyKitConnectFeatures
    """  # noqa: E501

    issue_reporter: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user can report linking issues directly to MoneyKit via 'Report Issue' button.",
    )
    enable_money_id: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user can register for, or login into, Money ID.",
    )
    duplicate_institution_warning: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user will see a warning when trying to connect to an institution for which             they already have a connected link.",
    )
    duplicate_institution_rejected: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, all institutions for which the user has a connected link will be hidden, so the user             will be unable to make another link to an institution to which they are already linked.",
    )
    connect_manually: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user can click a button in the MoneyKit Connect SDK to connect manually if the institution they are looking for doesn't exist in our catalog.",
    )
    permit_only_one_account: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user is allowed to grant permission only for one account.",
    )
    permit_only_depository_accounts: Optional[StrictBool] = Field(
        default=False,
        description="If enabled, the user is allowed to grant permission only for depository accounts.             If there are no depository accounts, the linking process will fail.",
    )
    additional_properties: Dict[str, Any] = {}
    __properties: ClassVar[List[str]] = [
        "issue_reporter",
        "enable_money_id",
        "duplicate_institution_warning",
        "duplicate_institution_rejected",
        "connect_manually",
        "permit_only_one_account",
        "permit_only_depository_accounts",
    ]

    model_config = {"populate_by_name": True, "validate_assignment": True}

    def to_str(self) -> str:
        """Returns the string representation of the model using alias"""
        return pprint.pformat(self.model_dump(by_alias=True))

    def to_json(self) -> str:
        """Returns the JSON representation of the model using alias"""
        # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
        return json.dumps(self.to_dict())

    @classmethod
    def from_json(cls, json_str: str) -> Self:
        """Create an instance of MoneyKitConnectFeatures from a JSON string"""
        return cls.from_dict(json.loads(json_str))

    def to_dict(self) -> Dict[str, Any]:
        """Return the dictionary representation of the model using alias.

        This has the following differences from calling pydantic's
        `self.model_dump(by_alias=True)`:

        * `None` is only added to the output dict for nullable fields that
          were set at model initialization. Other fields with value `None`
          are ignored.
        * Fields in `self.additional_properties` are added to the output dict.
        """
        _dict = self.model_dump(
            by_alias=True,
            exclude={
                "additional_properties",
            },
            exclude_none=True,
        )
        # puts key-value pairs in additional_properties in the top level
        if self.additional_properties is not None:
            for _key, _value in self.additional_properties.items():
                _dict[_key] = _value

        return _dict

    @classmethod
    def from_dict(cls, obj: Dict) -> Self:
        """Create an instance of MoneyKitConnectFeatures from a dict"""
        if obj is None:
            return None

        if not isinstance(obj, dict):
            return cls.model_validate(obj)

        _obj = cls.model_validate(
            {
                "issue_reporter": obj.get("issue_reporter")
                if obj.get("issue_reporter") is not None
                else False,
                "enable_money_id": obj.get("enable_money_id")
                if obj.get("enable_money_id") is not None
                else False,
                "duplicate_institution_warning": obj.get(
                    "duplicate_institution_warning"
                )
                if obj.get("duplicate_institution_warning") is not None
                else False,
                "duplicate_institution_rejected": obj.get(
                    "duplicate_institution_rejected"
                )
                if obj.get("duplicate_institution_rejected") is not None
                else False,
                "connect_manually": obj.get("connect_manually")
                if obj.get("connect_manually") is not None
                else False,
                "permit_only_one_account": obj.get("permit_only_one_account")
                if obj.get("permit_only_one_account") is not None
                else False,
                "permit_only_depository_accounts": obj.get(
                    "permit_only_depository_accounts"
                )
                if obj.get("permit_only_depository_accounts") is not None
                else False,
            }
        )
        # store additional fields in additional_properties
        for _key in obj.keys():
            if _key not in cls.__properties:
                _obj.additional_properties[_key] = obj.get(_key)

        return _obj
