# coding: utf-8

"""
    Zuora API Reference

    REST API reference for the Zuora Billing, Payments, and Central Platform! Check out the [REST API Overview](https://www.zuora.com/developer/api-references/api/overview/).

    The version of the OpenAPI document: 2024-05-20
    Contact: docs@zuora.com
    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 pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictFloat, StrictInt, StrictStr, field_validator
from typing import Any, ClassVar, Dict, List, Optional, Union
from typing_extensions import Annotated
from typing import Optional, Set
from typing_extensions import Self

class BusinessRegion(BaseModel):
    """
    BusinessRegion
    """ # noqa: E501
    # avoid validation
    def __init__(self, **kwargs):
        # Directly assign values without validation using `construct()`
        model = self.construct(**kwargs)
        self.__dict__.update(model.__dict__)

        _dict_all = convert_snake_dict_to_camel(kwargs, self.model_fields, self.__properties)

        _dict = self.to_alias_dict(_dict_all)
        for field_name, field_info in self.model_fields.items():
            alias = field_info.alias or field_name
            if alias in _dict:
                self.__dict__[field_name] = _dict.get(alias)
        self.update_additional_properties(self, _dict_all)
        pass

    def __setattr__(self, name, value):
        # Override setattr to bypass validation when setting attributes
        object.__setattr__(self, name, value)

    id: Optional[StrictStr] = Field(default=None, description="The unique ID of the e-invoicing business region. ")
    country: Optional[StrictStr] = Field(default=None, description="The short name of a country or region where you must comply with e-invoicing requirements. For example, `IN` for India. For the full list of country names and codes, see <a href=\"https://knowledgecenter.zuora.com/Quick_References/Country%2C_State%2C_and_Province_Codes/A_Country_Names_and_Their_ISO_Codes\" target=\"_blank\">ISO Standard Country Codes</a>. ")
    business_name: Optional[Annotated[str, Field(strict=True, max_length=255)]] = Field(default=None, description="The full official name that the Seller is registered with the relevant legal authority. ", alias="businessName")
    business_number: Optional[StrictStr] = Field(default=None, description="The specify the unique identifier number of the legal entity or person that you do business with.  For example, you must use a GSTIN for India and Tax Identification Number (TIN) for Saudi Arabia. ", alias="businessNumber")
    business_number_schema_id: Optional[StrictStr] = Field(default=None, description="The identification scheme identifier that an official registrar issues to identify the Seller as a legal entity or person. ", alias="businessNumberSchemaId")
    trade_name: Optional[Annotated[str, Field(strict=True, max_length=100)]] = Field(default=None, description="The name that the Seller is known as, other than the legal business name. ", alias="tradeName")
    tax_register_number: Optional[StrictStr] = Field(default=None, description="The Seller's VAT identifier (also known as Seller VAT identification number) or the local identification (defined by the Seller’s address) of the Seller for tax purposes, or a reference that enables the Seller to state the registered tax status. ", alias="taxRegisterNumber")
    endpoint_id: Optional[StrictStr] = Field(default=None, description="The Seller's electronic address, to which the application-level response to the e-invoice file might be delivered. ", alias="endpointId")
    endpoint_scheme_id: Optional[StrictStr] = Field(default=None, description="The identification scheme identifier of the Seller’s electronic address. ", alias="endpointSchemeId")
    address_line1: Optional[StrictStr] = Field(default=None, description="The first line of the Seller’s address, which is often a street address or business name. ", alias="addressLine1")
    address_line2: Optional[StrictStr] = Field(default=None, description="The second line of the Seller’s address, which is often the name of a building. ", alias="addressLine2")
    postal_code: Optional[StrictStr] = Field(default=None, description="The short code that can identify the business address. ", alias="postalCode")
    city: Optional[StrictStr] = Field(default=None, description="The the name of the city where the business is located. ")
    state: Optional[StrictStr] = Field(default=None, description="The name of the state or province where the business is located. ")
    contact_name: Optional[Annotated[str, Field(strict=True, max_length=255)]] = Field(default=None, description="The name of the Seller contact to receive e-invoicing data. ", alias="contactName")
    email: Optional[StrictStr] = Field(default=None, description="The email address of the Seller contact to receive e-invoicing data. ")
    phone_number: Optional[StrictStr] = Field(default=None, description="The business phone number of the Seller contact to receive e-invoicing data. ", alias="phoneNumber")
    service_provider_id: Optional[StrictStr] = Field(default=None, description="The unique ID of the e-invoicing service provider that is associated to the business region. ", alias="serviceProviderId")
    business_region_number: Optional[StrictStr] = Field(default=None, description="The unique number of the e-invoicing business region. ", alias="businessRegionNumber")
    digital_signature_enable: Optional[StrictBool] = Field(default=None, description="It will control that whether the pdf should be signed by vendor. ", alias="digitalSignatureEnable")
    digital_signature_box_enable: Optional[StrictBool] = Field(default=None, description="It will control whether the dignature box will be shown on the pdf. ", alias="digitalSignatureBoxEnable")
    digital_signature_box_pos_x: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="It is the X-axis that the box will be shown. ", alias="digitalSignatureBoxPosX")
    digital_signature_box_pos_y: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="It is the Y-axis that the box will be shown. ", alias="digitalSignatureBoxPosY")
    response_mapping: Optional[Dict[str, Any]] = Field(default=None, description="The response mapping of the e-invoicing business region. ", alias="responseMapping")
    process_type: Optional[StrictStr] = Field(default=None, description="The process type of the e-invoicing business region. ", alias="processType")
    invoice_enabled: Optional[StrictBool] = Field(default=None, description="It will control that whether the invoice should be supported by the process type or not. ", alias="invoiceEnabled")
    credit_memo_enabled: Optional[StrictBool] = Field(default=None, description="It will control that whether the credit memo should be supported by the process type or not. ", alias="creditMemoEnabled")
    debit_memo_enabled: Optional[StrictBool] = Field(default=None, description="It will control that whether the debit memo should be supported by the process type or not. ", alias="debitMemoEnabled")
    additional_properties: Dict[str, Any] = {}
    __properties: ClassVar[List[str]] = ["id", "country", "businessName", "businessNumber", "businessNumberSchemaId", "tradeName", "taxRegisterNumber", "endpointId", "endpointSchemeId", "addressLine1", "addressLine2", "postalCode", "city", "state", "contactName", "email", "phoneNumber", "serviceProviderId", "businessRegionNumber", "digitalSignatureEnable", "digitalSignatureBoxEnable", "digitalSignatureBoxPosX", "digitalSignatureBoxPosY", "responseMapping", "processType", "invoiceEnabled", "creditMemoEnabled", "debitMemoEnabled"]

    @field_validator('process_type')
    def process_type_validate_enum(cls, value):
        """Validates the enum"""
        if value is None:
            return value

        if value not in set(['Clearance', 'ClearanceWithCancellation', 'PostAudit', 'PEPPOLNetwork', 'Unknown']):
            raise ValueError("must be one of enum values ('Clearance', 'ClearanceWithCancellation', 'PostAudit', 'PEPPOLNetwork', 'Unknown')")
        return value

    model_config = ConfigDict(
        populate_by_name=True,
        validate_assignment=True,
        protected_namespaces=(),
    )


    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) -> Optional[Self]:
        """Create an instance of BusinessRegion 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.
        """
        excluded_fields: Set[str] = set([
            "additional_properties",
        ])

        _dict = self.model_dump(
            by_alias=True,
            exclude=excluded_fields,
            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: Optional[Dict[str, Any]]) -> Optional[Self]:
        """Create an instance of BusinessRegion from a dict"""
        if obj is None:
            return None

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

        obj = convert_snake_dict_to_camel(obj, cls.model_fields, cls.__properties)

        _obj = cls.model_validate(cls.to_alias_dict(obj))
        return cls.update_additional_properties(_obj, obj)

    @classmethod
    def update_additional_properties(cls, obj, _dict: Optional[Dict[str, Any]]):
        # store additional fields in additional_properties

        # store additional fields in additional_properties
        for _key in _dict.keys():
            if _key not in cls.__properties:
                obj.additional_properties[_key] = _dict.get(_key)


        return obj
        pass

    @classmethod
    def to_alias_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:

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

        return {
            "id": obj.get("id"),
            "country": obj.get("country"),
            "businessName": obj.get("businessName"),
            "businessNumber": obj.get("businessNumber"),
            "businessNumberSchemaId": obj.get("businessNumberSchemaId"),
            "tradeName": obj.get("tradeName"),
            "taxRegisterNumber": obj.get("taxRegisterNumber"),
            "endpointId": obj.get("endpointId"),
            "endpointSchemeId": obj.get("endpointSchemeId"),
            "addressLine1": obj.get("addressLine1"),
            "addressLine2": obj.get("addressLine2"),
            "postalCode": obj.get("postalCode"),
            "city": obj.get("city"),
            "state": obj.get("state"),
            "contactName": obj.get("contactName"),
            "email": obj.get("email"),
            "phoneNumber": obj.get("phoneNumber"),
            "serviceProviderId": obj.get("serviceProviderId"),
            "businessRegionNumber": obj.get("businessRegionNumber"),
            "digitalSignatureEnable": obj.get("digitalSignatureEnable"),
            "digitalSignatureBoxEnable": obj.get("digitalSignatureBoxEnable"),
            "digitalSignatureBoxPosX": obj.get("digitalSignatureBoxPosX"),
            "digitalSignatureBoxPosY": obj.get("digitalSignatureBoxPosY"),
            "responseMapping": obj.get("responseMapping"),
            "processType": obj.get("processType"),
            "invoiceEnabled": obj.get("invoiceEnabled"),
            "creditMemoEnabled": obj.get("creditMemoEnabled"),
            "debitMemoEnabled": obj.get("debitMemoEnabled")
        }
        return _obj


def convert_snake_dict_to_camel(_dict: dict, model_fields, properties):
    if not isinstance(_dict, dict):
        return _dict
    new_dict = {}
    for k, v in _dict.items():
        if k in model_fields:
            # model_fields: key is attribute name like bill_to_contact,
            alias = model_fields.get(k).alias or k
            new_dict[alias] = v
            pass
        else:
            new_key = snake_to_camel(k)
            if properties is not None and isinstance(properties, list) and new_key in properties:
                new_dict[new_key] = v
            else:
                new_dict[k] = v
    return new_dict
    pass


def snake_to_camel(name):
    if name is None or '_' not in name:
        return name
    components = name.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])
