from src.domain.connectors.catalog._base import (
    ConnectorActionDef,
    ConnectorChangelogEntry,
    ConnectorDef,
    ConnectorFieldDef,
    ConnectorTriggerDef,
)


CONNECTOR = ConnectorDef(
    key="stripe",
    name="Stripe",
    category="payments",
    auth_type="api_key",
    version="01.03.00",
    icon="stripe",
    image_url=None,  # set to your CDN URL
    description="Payments, checkout, customers, subscriptions, invoices, products, prices, refunds, and billing events.",
    docs_url="https://docs.stripe.com/api",
    config_fields=("publishable_key", "account_id",),
    secret_fields=("secret_key",),
    config_field_defs=(
        ConnectorFieldDef(
            key="publishable_key",
            label="Publishable key",
            description="Used only for client-side Stripe.js/Elements embeds. Not required for server-side actions.",
            placeholder="pk_live_...",
        ),
        ConnectorFieldDef(
            key="account_id",
            label="Connected account ID",
            description="Only needed when acting on behalf of a Stripe Connect account. Leave blank for your own account.",
            placeholder="acct_...",
        ),
    ),
    secret_field_defs=(
        ConnectorFieldDef(
            key="secret_key",
            label="Secret key",
            description="Your Stripe secret API key. Required for every server-side action.",
            placeholder="sk_live_...",
            required=True,
            input_type="password",
        ),
    ),
    actions=(
        ConnectorActionDef(
            key="create_customer",
            slug="stripe.create_customer",
            name="Create customer",
            description="Create a Stripe customer.",
            input_schema={
                "type": "object",
                "properties": {
                    "email": {"type": "string", "format": "email"},
                    "name": {"type": "string"},
                    "metadata": {"type": "object"},
                },
                "required": ["email"],
                "additionalProperties": True,
            },
            output_schema={
                "type": "object",
                "properties": {"id": {"type": "string"}, "object": {"type": "string"}},
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_setup_intent",
            slug="stripe.create_setup_intent",
            name="Create setup intent",
            description=(
                "Create a Stripe SetupIntent so the generated app can collect "
                "a card with Stripe.js."
            ),
            input_schema={
                "type": "object",
                "properties": {
                    "customer": {"type": "string"},
                    "usage": {"type": "string"},
                    "payment_method_types": {"type": "array"},
                    "metadata": {"type": "object"},
                },
                "required": ["customer"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="update_customer",
            slug="stripe.update_customer",
            name="Update customer",
            description="Update a Stripe customer.",
            input_schema={
                "type": "object",
                "properties": {
                    "customer_id": {"type": "string"},
                    "email": {"type": "string", "format": "email"},
                    "name": {"type": "string"},
                    "phone": {"type": "string"},
                    "description": {"type": "string"},
                    "metadata": {"type": "object"},
                },
                "required": ["customer_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="retrieve_customer",
            slug="stripe.retrieve_customer",
            name="Retrieve customer",
            description="Retrieve a Stripe customer.",
            input_schema={
                "type": "object",
                "properties": {"customer_id": {"type": "string"}},
                "required": ["customer_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="search_customers",
            slug="stripe.search_customers",
            name="Search customers",
            description="Search Stripe customers with a Stripe search query.",
            input_schema={
                "type": "object",
                "properties": {
                    "query": {"type": "string"},
                    "limit": {"type": "integer"},
                    "page": {"type": "string"},
                },
                "required": ["query"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_checkout",
            slug="stripe.create_checkout",
            name="Create checkout session",
            description="Create a Stripe Checkout Session.",
            input_schema={
                "type": "object",
                "properties": {
                    "line_items": {"type": "array"},
                    "success_url": {"type": "string"},
                    "cancel_url": {"type": "string"},
                    "mode": {"type": "string"},
                    "customer": {"type": "string"},
                    "customer_email": {"type": "string"},
                    "metadata": {"type": "object"},
                    "payment_intent_data": {"type": "object"},
                    "subscription_data": {"type": "object"},
                    "invoice_creation": {"type": "object"},
                },
                "required": ["line_items", "success_url", "cancel_url"],
                "additionalProperties": True,
            },
            output_schema={
                "type": "object",
                "properties": {"id": {"type": "string"}, "url": {"type": "string"}},
            },
            required_capabilities=("integrations.execute",),
            implements=("payments.checkout.create",),
        ),
        ConnectorActionDef(
            key="retrieve_checkout",
            slug="stripe.retrieve_checkout",
            name="Retrieve checkout session",
            description="Retrieve a Stripe Checkout Session.",
            input_schema={
                "type": "object",
                "properties": {"session_id": {"type": "string"}, "expand": {"type": "array"}},
                "required": ["session_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="expire_checkout",
            slug="stripe.expire_checkout",
            name="Expire checkout session",
            description="Expire an open Stripe Checkout Session.",
            input_schema={
                "type": "object",
                "properties": {"session_id": {"type": "string"}},
                "required": ["session_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_payment_intent",
            slug="stripe.create_payment_intent",
            name="Create payment intent",
            description="Create a Stripe PaymentIntent.",
            input_schema={
                "type": "object",
                "properties": {
                    "amount": {"type": "integer"},
                    "currency": {"type": "string"},
                    "customer": {"type": "string"},
                    "payment_method": {"type": "string"},
                    "confirm": {"type": "boolean"},
                    "off_session": {"type": "boolean"},
                    "capture_method": {"type": "string"},
                    "metadata": {"type": "object"},
                    "description": {"type": "string"},
                    "receipt_email": {"type": "string"},
                },
                "required": ["amount", "currency"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="retrieve_payment_intent",
            slug="stripe.retrieve_payment_intent",
            name="Retrieve payment intent",
            description="Retrieve a Stripe PaymentIntent.",
            input_schema={
                "type": "object",
                "properties": {"payment_intent_id": {"type": "string"}, "expand": {"type": "array"}},
                "required": ["payment_intent_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="capture_payment_intent",
            slug="stripe.capture_payment_intent",
            name="Capture payment intent",
            description="Capture an uncaptured Stripe PaymentIntent.",
            input_schema={
                "type": "object",
                "properties": {
                    "payment_intent_id": {"type": "string"},
                    "amount_to_capture": {"type": "integer"},
                    "metadata": {"type": "object"},
                },
                "required": ["payment_intent_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
            implements=("payments.order.capture",),
        ),
        ConnectorActionDef(
            key="cancel_payment_intent",
            slug="stripe.cancel_payment_intent",
            name="Cancel payment intent",
            description="Cancel a Stripe PaymentIntent.",
            input_schema={
                "type": "object",
                "properties": {
                    "payment_intent_id": {"type": "string"},
                    "cancellation_reason": {"type": "string"},
                },
                "required": ["payment_intent_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_refund",
            slug="stripe.create_refund",
            name="Create refund",
            description="Create a Stripe refund.",
            input_schema={
                "type": "object",
                "properties": {
                    "payment_intent": {"type": "string"},
                    "charge": {"type": "string"},
                    "amount": {"type": "integer"},
                    "reason": {"type": "string"},
                    "metadata": {"type": "object"},
                },
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
            implements=("payments.refund.create",),
        ),
        ConnectorActionDef(
            key="retrieve_refund",
            slug="stripe.retrieve_refund",
            name="Retrieve refund",
            description="Retrieve a Stripe refund.",
            input_schema={
                "type": "object",
                "properties": {"refund_id": {"type": "string"}},
                "required": ["refund_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_product",
            slug="stripe.create_product",
            name="Create product",
            description="Create a Stripe product.",
            input_schema={
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "description": {"type": "string"},
                    "metadata": {"type": "object"},
                },
                "required": ["name"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
            implements=("payments.catalog.upsert",),
        ),
        ConnectorActionDef(
            key="update_product",
            slug="stripe.update_product",
            name="Update product",
            description="Update a Stripe product. Amount changes must create a new Price.",
            input_schema={
                "type": "object",
                "properties": {
                    "product_id": {"type": "string"},
                    "name": {"type": "string"},
                    "description": {"type": "string"},
                    "active": {"type": "boolean"},
                    "metadata": {"type": "object"},
                },
                "required": ["product_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_price",
            slug="stripe.create_price",
            name="Create price",
            description="Create a Stripe price.",
            input_schema={
                "type": "object",
                "properties": {
                    "product": {"type": "string"},
                    "currency": {"type": "string"},
                    "unit_amount": {"type": "integer"},
                    "recurring": {"type": "object"},
                    "metadata": {"type": "object"},
                },
                "required": ["product", "currency"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="retrieve_price",
            slug="stripe.retrieve_price",
            name="Retrieve price",
            description="Retrieve a Stripe price.",
            input_schema={
                "type": "object",
                "properties": {"price_id": {"type": "string"}},
                "required": ["price_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_subscription",
            slug="stripe.create_subscription",
            name="Create subscription",
            description="Create a Stripe subscription.",
            input_schema={
                "type": "object",
                "properties": {
                    "customer": {"type": "string"},
                    "items": {"type": "array"},
                    "metadata": {"type": "object"},
                    "trial_period_days": {"type": "integer"},
                    "payment_behavior": {"type": "string"},
                },
                "required": ["customer", "items"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="update_subscription",
            slug="stripe.update_subscription",
            name="Update subscription",
            description="Update a Stripe subscription.",
            input_schema={
                "type": "object",
                "properties": {
                    "subscription_id": {"type": "string"},
                    "items": {"type": "array"},
                    "metadata": {"type": "object"},
                    "cancel_at_period_end": {"type": "boolean"},
                    "proration_behavior": {"type": "string"},
                },
                "required": ["subscription_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="retrieve_subscription",
            slug="stripe.retrieve_subscription",
            name="Retrieve subscription",
            description="Retrieve a Stripe subscription.",
            input_schema={
                "type": "object",
                "properties": {"subscription_id": {"type": "string"}, "expand": {"type": "array"}},
                "required": ["subscription_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="cancel_subscription",
            slug="stripe.cancel_subscription",
            name="Cancel subscription",
            description="Cancel a Stripe subscription.",
            input_schema={
                "type": "object",
                "properties": {
                    "subscription_id": {"type": "string"},
                    "invoice_now": {"type": "boolean"},
                    "prorate": {"type": "boolean"},
                    "cancellation_details": {"type": "object"},
                },
                "required": ["subscription_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_invoice",
            slug="stripe.create_invoice",
            name="Create invoice",
            description="Create a Stripe invoice.",
            input_schema={
                "type": "object",
                "properties": {
                    "customer": {"type": "string"},
                    "subscription": {"type": "string"},
                    "collection_method": {"type": "string"},
                    "auto_advance": {"type": "boolean"},
                    "metadata": {"type": "object"},
                },
                "required": ["customer"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="retrieve_invoice",
            slug="stripe.retrieve_invoice",
            name="Retrieve invoice",
            description="Retrieve a Stripe invoice.",
            input_schema={
                "type": "object",
                "properties": {"invoice_id": {"type": "string"}, "expand": {"type": "array"}},
                "required": ["invoice_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="finalize_invoice",
            slug="stripe.finalize_invoice",
            name="Finalize invoice",
            description="Finalize a draft Stripe invoice.",
            input_schema={
                "type": "object",
                "properties": {"invoice_id": {"type": "string"}, "auto_advance": {"type": "boolean"}},
                "required": ["invoice_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="pay_invoice",
            slug="stripe.pay_invoice",
            name="Pay invoice",
            description="Pay a Stripe invoice.",
            input_schema={
                "type": "object",
                "properties": {
                    "invoice_id": {"type": "string"},
                    "payment_method": {"type": "string"},
                },
                "required": ["invoice_id"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="void_invoice",
            slug="stripe.void_invoice",
            name="Void invoice",
            description="Void a Stripe invoice.",
            input_schema={
                "type": "object",
                "properties": {"invoice_id": {"type": "string"}},
                "required": ["invoice_id"],
                "additionalProperties": False,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_billing_portal_session",
            slug="stripe.create_billing_portal_session",
            name="Create billing portal session",
            description="Create a Stripe Billing Portal Session.",
            input_schema={
                "type": "object",
                "properties": {
                    "customer": {"type": "string"},
                    "return_url": {"type": "string"},
                    "configuration": {"type": "string"},
                },
                "required": ["customer"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_tax_calculation",
            slug="stripe.create_tax_calculation",
            name="Create tax calculation",
            description="Calculate tax for a custom payment flow through Stripe Tax.",
            input_schema={
                "type": "object",
                "properties": {
                    "currency": {"type": "string"},
                    "customer": {"type": "string"},
                    "customer_details": {"type": "object"},
                    "line_items": {"type": "array"},
                    "shipping_cost": {"type": "object"},
                    "ship_from_details": {"type": "object"},
                    "tax_date": {"type": "integer"},
                },
                "required": ["currency", "line_items"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
        ConnectorActionDef(
            key="create_tax_transaction_from_calculation",
            slug="stripe.create_tax_transaction_from_calculation",
            name="Create tax transaction from calculation",
            description="Post a Stripe Tax transaction from an unexpired calculation.",
            input_schema={
                "type": "object",
                "properties": {
                    "calculation": {"type": "string"},
                    "reference": {"type": "string"},
                    "metadata": {"type": "object"},
                    "posted_at": {"type": "integer"},
                },
                "required": ["calculation", "reference"],
                "additionalProperties": True,
            },
            required_capabilities=("integrations.execute",),
        ),
    ),
    triggers=(
        ConnectorTriggerDef(
            key="checkout_session_completed",
            event_type="stripe.checkout.session.completed",
            name="Checkout session completed",
        ),
        ConnectorTriggerDef(
            key="setup_intent_succeeded",
            event_type="stripe.setup_intent.succeeded",
            name="Setup intent succeeded",
        ),
        ConnectorTriggerDef(
            key="setup_intent_failed",
            event_type="stripe.setup_intent.setup_failed",
            name="Setup intent failed",
        ),
        ConnectorTriggerDef(
            key="payment_intent_succeeded",
            event_type="stripe.payment_intent.succeeded",
            name="Payment intent succeeded",
        ),
        ConnectorTriggerDef(
            key="payment_intent_failed",
            event_type="stripe.payment_intent.payment_failed",
            name="Payment intent failed",
        ),
        ConnectorTriggerDef(
            key="invoice_paid",
            event_type="stripe.invoice.paid",
            name="Invoice paid",
        ),
        ConnectorTriggerDef(
            key="invoice_payment_failed",
            event_type="stripe.invoice.payment_failed",
            name="Invoice payment failed",
        ),
        ConnectorTriggerDef(
            key="subscription_created",
            event_type="stripe.customer.subscription.created",
            name="Subscription created",
        ),
        ConnectorTriggerDef(
            key="subscription_updated",
            event_type="stripe.customer.subscription.updated",
            name="Subscription updated",
        ),
        ConnectorTriggerDef(
            key="subscription_deleted",
            event_type="stripe.customer.subscription.deleted",
            name="Subscription deleted",
        ),
        ConnectorTriggerDef(
            key="charge_refunded",
            event_type="stripe.charge.refunded",
            name="Charge refunded",
        ),
        ConnectorTriggerDef(
            key="refund_created",
            event_type="stripe.refund.created",
            name="Refund created",
        ),
    ),
    changelog=(
        ConnectorChangelogEntry(
            version="01.00.00",
            date="2026-04-26",
            notes="Initial release. Actions: create_customer, create_checkout. Triggers: checkout.session.completed, payment_intent.succeeded.",
        ),
        ConnectorChangelogEntry(
            version="01.01.00",
            date="2026-04-26",
            notes="Expanded Stripe catalog with customers, checkout lifecycle, payment intents, refunds, products, prices, subscriptions, invoices, billing portal sessions, and billing/payment webhook triggers.",
        ),
        ConnectorChangelogEntry(
            version="01.03.00",
            date="2026-09-18",
            notes=(
                "Stripe checkout, capture, refund, and product actions now implement "
                "canonical payments.* invoke capabilities."
            ),
        ),
    ),
)
