# Copilot Instructions for TJWater Server

This repository contains the backend code for the TJWater Server, a water distribution network management system built with FastAPI.

## High-Level Architecture

The application follows a layered architecture:

- **Entry Point**: `app/main.py` initializes the FastAPI application, database connections (PostgreSQL & TimescaleDB), and middleware.
- **API Layer**: `app/api/v1` contains the route handlers.
- **Service Layer**: `app/services` contains business logic and orchestration.
- **Infrastructure Layer**: `app/infra` handles database connections (`db`), audit logging (`audit`), and external integrations.
- **Domain Layer**: `app/domain` likely contains core domain models.
- **Native/Algorithms**: `app/native` and `app/algorithms` handle specialized water network calculations (possibly using EPANET/WNTR).

## Build, Test, and Run Commands

### Environment Setup

- Dependencies are listed in `requirements.txt`.
- Configuration is managed via environment variables (see `.env.example` if available, or `app/core/config.py`).
- **Important**: Ensure `.env` is configured with correct database credentials for both PostgreSQL and TimescaleDB.

If first time setting up, you may want to create a Conda environment:

```bash
conda create -n server python=3.12
conda activate server
pip install uv
uv pip install -r requirements.txt
conda install -c conda-forge pymetis
```

### Running the Server

The preferred way to run the server locally is using the helper script which sets up the Python path correctly:

```bash
conda activate server
python scripts/run_server.py
```

Alternatively, you can run directly with uvicorn (ensure PYTHONPATH includes the root):

```bash
conda activate server
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
```

### Running Tests

Use `pytest` to run tests. The `tests/conftest.py` handles path setup.

```bash
# Run all tests
pytest

# Run a specific test file
pytest tests/unit/test_specific_file.py

# Run a specific test case
pytest tests/unit/test_specific_file.py::test_function_name
```

### Building (Optional)

The project includes scripts to compile Python modules to `.pyd` files using Cython (see `scripts/build_pyd.py`). This is likely for distribution/performance but not required for standard development.

## Key Conventions

- **Async/Await**: The codebase heavily uses `async` and `await` for I/O operations, especially database interactions.
- **Database Management**:
  - Connections are managed globally in `app.infra.db` and initialized in `lifespan` (app/main.py).
  - Use `app.infra.db.dynamic_manager` for project-specific database connections (multi-tenancy/dynamic projects).
- **Pydantic**: extensively used for data validation and settings management.
- **Scripts**: The `scripts/` directory contains many utility scripts for maintenance, data processing, and server management. Check there before writing new operational scripts.
- **Water Network Modeling**: Interactions with water network models often involve `epanet` or `wntr` libraries. Be aware of domain-specific terminology (nodes, links, junctions, tanks).

## Code Style

- Follow standard PEP 8 guidelines.
- No specific linter configuration was found, so default to standard Python formatting.
