# coding: utf-8

"""
    PAY.JP API v2

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

    The version of the OpenAPI document: 2.0.0
    Contact: support@pay.jp
    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 datetime
from pydantic import BaseModel, ConfigDict, Field, StrictStr
from typing import Any, ClassVar, Dict, List, Optional
from typing_extensions import Annotated
from payjpv2.models.checkout_session_mode import CheckoutSessionMode
from payjpv2.models.checkout_session_payment_method_options_request import CheckoutSessionPaymentMethodOptionsRequest
from payjpv2.models.checkout_session_submit_type import CheckoutSessionSubmitType
from payjpv2.models.checkout_session_ui_mode import CheckoutSessionUIMode
from payjpv2.models.currency import Currency
from payjpv2.models.customer_creation import CustomerCreation
from payjpv2.models.line_item_request import LineItemRequest
from payjpv2.models.locale import Locale
from payjpv2.models.metadata_value import MetadataValue
from payjpv2.models.payment_flow_data_request import PaymentFlowDataRequest
from payjpv2.models.payment_method_types import PaymentMethodTypes
from payjpv2.models.setup_flow_data_request import SetupFlowDataRequest
from typing import Optional, Set
from typing_extensions import Self

class CheckoutSessionCreateRequest(BaseModel):
    """
    CheckoutSessionCreateRequest
    """ # noqa: E501
    mode: CheckoutSessionMode = Field(description="Checkout Session のモード  | 指定できる値 | |:---| | **payment**: 支払いモードで Checkout Session を作成します。 | | **setup**: セットアップモードで Checkout Session を作成します。 |")
    client_reference_id: Optional[StrictStr] = Field(default=None, description="ID")
    customer_id: Optional[StrictStr] = Field(default=None, description="顧客 ID")
    customer_email: Optional[StrictStr] = Field(default=None, description="顧客オブジェクトを作成する時に使われます。指定されていない場合、顧客にメールアドレスの入力を求めます。すでに顧客のメールアドレスを持っている場合は、このパラメータを使ってあらかじめ情報を入力しておくことが可能です。")
    customer_creation: Optional[CustomerCreation] = Field(default=None, description="Checkout Session の確定時に Customer を作成するかどうかを指定します。<br> `payment` および `setup` モードでのみ設定可能です。")
    line_items: Optional[Annotated[List[LineItemRequest], Field(max_length=100)]] = Field(default=None, description="顧客が購入する商品のリストです。このパラメーターを使用して、1回限りまたは定期的な料金を渡します。  `payment` モードの場合、最大100個のラインアイテムを使用できます。")
    metadata: Optional[Dict[str, MetadataValue]] = Field(default=None, description="キーバリューの任意のデータを格納できます。20件まで登録可能で、空文字列を指定するとそのキーを削除できます。<a href=\"https://docs.pay.jp/v2/guide/developers/metadata\">詳細はメタデータのドキュメントを参照してください。</a>")
    success_url: Optional[StrictStr] = Field(default=None, description="支払いや設定が完了した際に、PAY.JP が顧客をリダイレクトする URL。成功した Checkout Session からの情報をページで使用したい場合は、成功ページのカスタマイズに関するガイドをお読みください。")
    cancel_url: Optional[StrictStr] = Field(default=None, description="キャンセル時のリダイレクト URL")
    currency: Optional[Currency] = Field(default=None, description="価格の通貨。現在は `jpy` のみサポートしています。")
    expires_at: Optional[datetime] = Field(default=None, description="Checkout Session の有効期限が失効する日時")
    locale: Optional[Locale] = Field(default=None, description="Checkout 画面の表示言語を指定します。  | 指定できる値 | |:---| | **ja**: 日本語で表示します。 |")
    payment_method_types: Optional[List[PaymentMethodTypes]] = Field(default=None, description="この PaymentFlow で使用できる支払い方法の種類（カードなど）のリストです。指定しない場合、管理画面で利用可能な状態にしている支払い方法を自動的に表示します。")
    payment_method_options: Optional[CheckoutSessionPaymentMethodOptionsRequest] = Field(default=None, description="この PaymentFlow の支払い方法の個別設定")
    payment_flow_data: Optional[PaymentFlowDataRequest] = Field(default=None, description="`payment` モード指定時に PaymentFlow 作成に使用するパラメーター")
    submit_type: Optional[CheckoutSessionSubmitType] = Field(default=None, description="Checkout の画面上に表示される送信ボタンなど、ページ上の関連テキストをカスタマイズするために使用されます。<br> `submit_type` は、`payment` モードの Checkout Session でのみ指定できます。未指定時、あるいは `auto` の場合、`pay` が使用されます。  | 指定できる値 | |:---| | **auto**: `pay` が使用されます。 | | **pay**: 「支払う」（デフォルト） | | **book**: 「予約する」 | | **donate**: 「寄付する」 |")
    setup_flow_data: Optional[SetupFlowDataRequest] = Field(default=None, description="`setup` モードの Checkout Session を作成する際、SetupFlow の作成に渡されるパラメーター")
    ui_mode: Optional[CheckoutSessionUIMode] = Field(default=None, description="Checkout Session の UI モード。デフォルトは `hosted` です。  | 指定できる値 | |:---| | **hosted**: PAY.JP でホスティングしている画面を使用します。 |")
    __properties: ClassVar[List[str]] = ["mode", "client_reference_id", "customer_id", "customer_email", "customer_creation", "line_items", "metadata", "success_url", "cancel_url", "currency", "expires_at", "locale", "payment_method_types", "payment_method_options", "payment_flow_data", "submit_type", "setup_flow_data", "ui_mode"]

    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"""
        return json.dumps(self.model_dump(by_alias=True, exclude_unset=True))

    @classmethod
    def from_json(cls, json_str: str) -> Optional[Self]:
        """Create an instance of CheckoutSessionCreateRequest 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.
        """
        excluded_fields: Set[str] = set([
        ])

        _dict = self.model_dump(
            by_alias=True,
            exclude=excluded_fields,
            exclude_none=True,
        )
        # override the default output from pydantic by calling `to_dict()` of each item in line_items (list)
        _items = []
        if self.line_items:
            for _item_line_items in self.line_items:
                if _item_line_items:
                    _items.append(_item_line_items.to_dict())
            _dict['line_items'] = _items
        # override the default output from pydantic by calling `to_dict()` of each value in metadata (dict)
        _field_dict = {}
        if self.metadata:
            for _key_metadata in self.metadata:
                if self.metadata[_key_metadata]:
                    _field_dict[_key_metadata] = self.metadata[_key_metadata].to_dict()
            _dict['metadata'] = _field_dict
        # override the default output from pydantic by calling `to_dict()` of payment_method_options
        if self.payment_method_options:
            _dict['payment_method_options'] = self.payment_method_options.to_dict()
        # override the default output from pydantic by calling `to_dict()` of payment_flow_data
        if self.payment_flow_data:
            _dict['payment_flow_data'] = self.payment_flow_data.to_dict()
        # override the default output from pydantic by calling `to_dict()` of setup_flow_data
        if self.setup_flow_data:
            _dict['setup_flow_data'] = self.setup_flow_data.to_dict()
        return _dict

    @classmethod
    def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
        """Create an instance of CheckoutSessionCreateRequest from a dict"""
        if obj is None:
            return None

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

        _obj = cls.model_validate({
            "mode": obj.get("mode"),
            "client_reference_id": obj.get("client_reference_id"),
            "customer_id": obj.get("customer_id"),
            "customer_email": obj.get("customer_email"),
            "customer_creation": obj.get("customer_creation"),
            "line_items": [LineItemRequest.from_dict(_item) for _item in obj["line_items"]] if obj.get("line_items") is not None else None,
            "metadata": dict(
                (_k, MetadataValue.from_dict(_v))
                for _k, _v in obj["metadata"].items()
            )
            if obj.get("metadata") is not None
            else None,
            "success_url": obj.get("success_url"),
            "cancel_url": obj.get("cancel_url"),
            "currency": obj.get("currency"),
            "expires_at": obj.get("expires_at"),
            "locale": obj.get("locale"),
            "payment_method_types": obj.get("payment_method_types"),
            "payment_method_options": CheckoutSessionPaymentMethodOptionsRequest.from_dict(obj["payment_method_options"]) if obj.get("payment_method_options") is not None else None,
            "payment_flow_data": PaymentFlowDataRequest.from_dict(obj["payment_flow_data"]) if obj.get("payment_flow_data") is not None else None,
            "submit_type": obj.get("submit_type"),
            "setup_flow_data": SetupFlowDataRequest.from_dict(obj["setup_flow_data"]) if obj.get("setup_flow_data") is not None else None,
            "ui_mode": obj.get("ui_mode")
        })
        return _obj


