# coding: utf-8

"""
Cashfree Payment Gateway APIs

Cashfree's Payment Gateway APIs provide developers with a streamlined pathway to integrate advanced payment processing capabilities into their applications, platforms and websites.

The version of the OpenAPI document: 2023-08-01
Contact: developers@cashfree.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 datetime import date, datetime


from pydantic import validate_arguments, ValidationError, Field, StrictStr, StrictBytes, StrictInt, StrictFloat, StrictBool, field_validator, BaseModel
from typing import Any, Dict, List, Optional, Tuple, Union
from typing_extensions import Annotated

class CreateSubscriptionRequestPlanDetails(BaseModel):
    """
    CreateSubscriptionRequestPlanDetails
    """
    plan_id: Optional[StrictStr] = Field(default=None, description="The unique identifier used to create plan. You only need to pass this field if you had already created plan. Otherwise use the other fields here to define the plan.")
    plan_name: Optional[Annotated[str, Field(strict=True, max_length=40)]] = Field(default=None, description="Specify plan name for easy reference.")
    plan_type: Optional[StrictStr] = Field(default=None, description="Possible values ON_DEMAND or PERIODIC. PERIODIC - Payments are triggered automatically at fixed intervals defined by the merchant. ON_DEMAND - Merchant needs to trigger/charge the customer explicitly with the required amount.")
    plan_currency: Optional[StrictStr] = Field(default=None, description="INR by default.")
    plan_amount: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="The amount to be charged for PERIODIC plan. This is a conditional parameter, only required for PERIODIC plans.")
    plan_max_amount: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="This is the maximum amount that can be charged on a subscription.")
    plan_max_cycles: Optional[StrictInt] = Field(default=None, description="Maximum number of debits set for the plan. The subscription will automatically change to COMPLETED status once this limit is reached.")
    plan_intervals: Optional[StrictInt] = Field(default=None, description="Number of intervals of intervalType between every subscription payment. For example, to charge a customer bi-weekly use intervalType as “week” and intervals as 2. Required for PERIODIC plan. The default value is 1.")
    plan_interval_type: Optional[StrictStr] = Field(default=None, description="The type of interval for a PERIODIC plan like DAY, WEEK, MONTH, or YEAR. This is a conditional parameter only applicable for PERIODIC plans.")
    plan_note: Optional[StrictStr] = Field(default=None, description="Note for the plan.")
    __properties = ["plan_id", "plan_name", "plan_type", "plan_currency", "plan_amount", "plan_max_amount", "plan_max_cycles", "plan_intervals", "plan_interval_type", "plan_note"]

    # Updated to Pydantic v2
    """Pydantic configuration"""
    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.dict(by_alias=True))

    def to_json(self) -> str:
        """Returns the JSON representation of the model using alias"""
        return json.dumps(self.to_dict())

    @classmethod
    def from_json(cls, json_str: str) -> CreateSubscriptionRequestPlanDetails:
        """Create an instance of CreateSubscriptionRequestPlanDetails from a JSON string"""
        return cls.from_dict(json.loads(json_str))
    
    @classmethod
    def from_json_for_one_of(cls, json_str: str) -> CreateSubscriptionRequestPlanDetails:
        """Create an instance of CreateSubscriptionRequestPlanDetails from a JSON string"""
        temp_dict = json.loads(json_str)
        if "plan_id, plan_name, plan_type, plan_currency, plan_amount, plan_max_amount, plan_max_cycles, plan_intervals, plan_interval_type, plan_note" in temp_dict.keys():
            return cls.from_dict(json.loads(json_str))
        return None

    def to_dict(self):
        """Returns the dictionary representation of the model using alias"""
        _dict = self.dict(by_alias=True,
                          exclude={
                          },
                          exclude_none=True)
        return _dict

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

        if not isinstance(obj, dict):
            return CreateSubscriptionRequestPlanDetails.parse_obj(obj)

        _obj = CreateSubscriptionRequestPlanDetails.parse_obj({
            "plan_id": obj.get("plan_id"),
            "plan_name": obj.get("plan_name"),
            "plan_type": obj.get("plan_type"),
            "plan_currency": obj.get("plan_currency"),
            "plan_amount": obj.get("plan_amount"),
            "plan_max_amount": obj.get("plan_max_amount"),
            "plan_max_cycles": obj.get("plan_max_cycles"),
            "plan_intervals": obj.get("plan_intervals"),
            "plan_interval_type": obj.get("plan_interval_type"),
            "plan_note": obj.get("plan_note")
        })
        return _obj


# Pydantic v2: resolve forward references & Annotated types
CreateSubscriptionRequestPlanDetails.model_rebuild()

