# Intégration Interface TIM - Connexion Backend

## Résumé des modifications

L'interface TIM a été connectée au backend pour afficher les données réelles des patients et séjours.

## Problème résolu

L'interface affichait "Non renseigné" pour toutes les informations patient (âge, dates d'admission/sortie, sexe, spécialité) car :
1. Les données n'étaient pas correctement transmises depuis l'API
2. Le modèle `StayDB` ne contenait pas tous les champs nécessaires
3. La structure des données n'était pas correctement mappée

## Modifications apportées

### 1. API Backend (`src/pipeline_mco_pmsi/api/tim_api.py`)

#### Ajout du champ `age` dans la réponse
```python
class CodingProposalResponse(BaseModel):
    stay_id: str
    age: Optional[int] = None  # Nouveau champ
    patient_id: Optional[str] = None
    admission_date: Optional[str] = None
    discharge_date: Optional[str] = None
    birth_date: Optional[str] = None
    sex: Optional[str] = None
    weight: Optional[float] = None
    height: Optional[float] = None
    specialty: Optional[str] = None
    # ...
```

#### Calcul de la date de naissance à partir de l'âge
```python
# Calculer la date de naissance approximative à partir de l'âge si disponible
birth_date = None
if stay.age and stay.admission_date:
    from dateutil.relativedelta import relativedelta
    birth_date = (stay.admission_date - relativedelta(years=stay.age)).isoformat()

return CodingProposalResponse(
    stay_id=stay_id,
    age=stay.age,  # Transmettre l'âge directement
    patient_id=stay.stay_id,
    admission_date=stay.admission_date.isoformat() if stay.admission_date else None,
    discharge_date=stay.discharge_date.isoformat() if stay.discharge_date else None,
    birth_date=birth_date,  # Date de naissance calculée
    sex=stay.sex,
    specialty=stay.specialty,
    # ...
)
```

### 2. Frontend - PatientHeader (`src/pipeline_mco_pmsi/api/static/js/components/patient-header.js`)

#### Utilisation de l'âge fourni par le serveur
```javascript
calculateAge(birthDate, ageFromServer = null) {
    // Si l'âge est déjà fourni par le serveur, l'utiliser
    if (ageFromServer !== null && ageFromServer !== undefined) {
        return ageFromServer;
    }
    
    // Sinon, calculer depuis birthDate
    if (!birthDate) {
        return null;
    }
    // ...
}
```

#### Rendu avec l'âge du séjour
```javascript
render(stay) {
    const patient = stay.patient || {};
    const admission = stay.admission || {};
    const discharge = stay.discharge || {};
    
    // Utiliser l'âge du séjour s'il est disponible
    const age = stay.age || this.calculateAge(patient.birthDate, stay.age);
    const bmi = this.calculateBMI(patient.weight, patient.height);
    const duration = this.calculateStayDuration(admission.date, discharge.date);
    // ...
}
```

### 3. Frontend - index.html

#### Transmission de l'âge dans l'objet stay
```javascript
const stay = {
    stay_id: data.stay_id,
    age: data.age,  // Ajouter l'âge directement depuis l'API
    patient: {
        id: data.patient_id || data.stay_id,
        birthDate: data.birth_date,
        sex: data.sex,
        weight: data.weight,
        height: data.height
    },
    admission: {
        date: data.admission_date,
        mode: null,
        specialty: data.specialty
    },
    discharge: {
        date: data.discharge_date,
        mode: null
    },
    codes: []
};
```

## Données disponibles dans StayDB

Le modèle `StayDB` contient les champs suivants :
- `stay_id`: Identifiant du séjour
- `admission_date`: Date d'admission
- `discharge_date`: Date de sortie
- `specialty`: Spécialité médicale
- `age`: Âge du patient
- `sex`: Sexe du patient (M/F)
- `unit`: Unité médicale (optionnel)
- `status`: Statut du séjour

## Données non disponibles

Les champs suivants ne sont pas stockés dans `StayDB` et s'affichent comme "Non renseigné" :
- `weight`: Poids du patient
- `height`: Taille du patient
- `admission.mode`: Mode d'entrée
- `discharge.mode`: Mode de sortie

Pour ajouter ces données, il faudrait :
1. Modifier le modèle `StayDB` pour inclure ces champs
2. Mettre à jour le pipeline de traitement pour extraire ces informations
3. Modifier l'API pour transmettre ces données

## Test de l'interface

### Créer un séjour de test

```python
from datetime import datetime
from pipeline_mco_pmsi.database.base import get_db
from pipeline_mco_pmsi.database.models import StayDB, ClinicalDocumentDB, CodeDB, EvidenceDB

db = next(get_db())

# Créer un séjour
stay = StayDB(
    stay_id='TEST001',
    admission_date=datetime(2024, 1, 15),
    discharge_date=datetime(2024, 1, 20),
    specialty='Chirurgie',
    age=65,
    sex='M',
    status='proposed'
)
db.add(stay)
db.commit()

# Ajouter un document
doc = ClinicalDocumentDB(
    document_id='DOC001',
    stay_id=stay.id,
    document_type='CR_HOSPI',
    content='Patient de 65 ans admis pour appendicite aiguë.',
    creation_date=datetime(2024, 1, 15),
    author='Dr. Martin',
    priority=1
)
db.add(doc)
db.commit()

# Ajouter un code avec preuve
dp = CodeDB(
    stay_id=stay.id,
    code='K35.8',
    label='Appendicite aiguë',
    type='dp',
    confidence=0.95,
    reasoning='Diagnostic principal',
    referentiel_version='CIM-10 2024',
    status='proposed',
    model_name='llama3.2',
    model_digest='abc123',
    prompt_version='1.0'
)
db.add(dp)
db.commit()

# Ajouter une preuve
evidence = EvidenceDB(
    code_id=dp.id,
    document_id=doc.id,
    span_start=0,
    span_end=50,
    text='Patient de 65 ans admis pour appendicite aiguë',
    context='Patient de 65 ans admis pour appendicite aiguë.'
)
db.add(evidence)
db.commit()
```

### Démarrer le serveur

```bash
cd src
uvicorn pipeline_mco_pmsi.api.tim_api:app --reload --host 0.0.0.0 --port 8000
```

### Accéder à l'interface

1. Ouvrir http://localhost:8000 dans un navigateur
2. Entrer l'identifiant du séjour : `TEST001`
3. Cliquer sur "Charger le séjour"

### Résultat attendu

L'interface doit afficher :
- **Identifiant**: •••T001 (anonymisé)
- **Âge**: 65 ans
- **Sexe**: M
- **IMC**: Non renseigné (pas de poids/taille)
- **Admission**: 15/01/2024
- **Sortie**: 20/01/2024
- **Durée**: 5 jours
- **Spécialité**: Chirurgie
- **Mode d'entrée**: Non renseigné
- **Mode de sortie**: Non renseigné

## Prochaines étapes

1. Charger les documents du séjour depuis la base de données
2. Afficher les faits cliniques dans le panneau de détails
3. Implémenter la navigation entre codes, preuves et documents
4. Tester avec des séjours réels du pipeline
