# User Management

A Python package for managing user-related operations using Firebase Authentication.

## Installation

You can install the package using pip:

```bash
pip install user-management
```

## Prerequisites

1. A Firebase project
2. Firebase service account credentials (as a JSON file or dictionary)
   - Go to Firebase Console
   - Project Settings > Service Accounts
   - Generate New Private Key
3. Stripe API key (if using Stripe integration)

## Configuration

The package provides a global configuration system that allows you to customize various settings in one place. You can configure settings in two ways:

1. Using the `configure` function:
```python
import user_management

user_management.configure(
    # Firebase configurations
    firebase_credentials_path="path/to/firebase-credentials.json",
    # OR
    firebase_credentials_dict={
        "type": "service_account",
        "project_id": "your-project-id",
        ...
    },
    firebase_app_name="your-app-name",  # Optional
    
    # Stripe configurations
    stripe_api_key="your-stripe-api-key",
    stripe_api_version="2023-10-16",  # Optional
    stripe_webhook_secret="your-webhook-secret",  # Optional
    
    # Database table names
    user_table_name="custom_users",
    organization_table_name="custom_orgs",
    subscription_table_name="custom_subscriptions"
)
```

2. Directly through the config object:
```python
from user_management import config

# Firebase configurations
config.firebase_credentials_path = "path/to/firebase-credentials.json"
config.firebase_app_name = "your-app-name"

# Stripe configurations
config.stripe_api_key = "your-stripe-api-key"

# Database table names
config.user_table_name = "custom_users"
config.organization_table_name = "custom_orgs"
```

### Available Configuration Options

#### Firebase Configuration
- `firebase_credentials_path`: Path to Firebase service account credentials JSON file
- `firebase_credentials_dict`: Dictionary containing Firebase credentials
- `firebase_app_name`: Optional name for the Firebase app instance

#### Stripe Configuration
- `stripe_api_key`: Your Stripe API key
- `stripe_api_version`: Stripe API version to use (default: "2023-10-16")
- `stripe_webhook_secret`: Your Stripe webhook secret for verifying webhooks

#### Database Table Names
- `user_table_name`: Name of the users table (default: "users")
- `organization_table_name`: Name of the organizations table (default: "organizations")
- `subscription_table_name`: Name of the subscriptions table (default: "subscriptions")

You can also add custom configuration options which will be stored in the `custom_settings` dictionary:
```python
user_management.configure(
    custom_setting_1="value1",
    custom_setting_2="value2"
)

# Access custom settings
value = config.get("custom_setting_1", default="default_value")
```

## Usage

### Firebase Authentication

```python
from user_management import FirebaseClient

# Initialize client using configuration (recommended)
client = FirebaseClient()

# Or provide credentials directly
client = FirebaseClient("path/to/firebase-credentials.json")

# Create a new user
user = client.create_user(
    email="user@example.com",
    password="securepassword123",
    display_name="John Doe"
)
```

### Stripe Integration

```python
from user_management import StripeClient

# Initialize client using configuration (recommended)
client = StripeClient()

# Or provide API key directly
client = StripeClient(api_key="your-stripe-api-key")

# Create a new customer
customer = client.create_customer(
    email="customer@example.com",
    name="John Doe"
)
```

### User Profiles and Organizations

```python
from user_management import UserProfileClient, CustomerClient

# Initialize clients using configuration (recommended)
user_client = UserProfileClient()
org_client = CustomerClient()

# Create user profile
user = user_client.create_user(
    email="user@example.com",
    name="John Doe"
)

# Create organization
org = org_client.create_customer(
    name="Acme Corp",
    subscription_id="stripe_subscription_id",
    users=[user["id"]],
    is_org=True
)
```

## Features

- User creation and management
- User information retrieval and updates
- Custom claims management
- JWT token verification
- Type-safe with Pydantic models
- Full Firebase Authentication integration
- Flexible initialization with file path or credentials dictionary
- Strong type hints and documentation

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.