# MyTischtennis URL Parser

## Übersicht

Der URL-Parser ermöglicht es, myTischtennis-Team-URLs automatisch zu parsen und die Konfiguration für automatische Datenabrufe vorzunehmen.

## Verwendung

### 1. URL Parsen

**Endpoint:** `POST /api/mytischtennis/parse-url`

**Request:**
```json
{
  "url": "https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer_TC_(J11)/spielerbilanzen/gesamt"
}
```

**Response:**
```json
{
  "success": true,
  "data": {
    "association": "HeTTV",
    "season": "25/26",
    "type": "ligen",
    "groupname": "1.Kreisklasse",
    "groupId": "504417",
    "teamId": "2995094",
    "teamname": "Harheimer TC (J11)",
    "originalUrl": "https://www.mytischtennis.de/click-tt/...",
    "clubId": "43030",
    "clubName": "Harheimer TC",
    "teamName": "Jugend 11",
    "leagueName": "Jugend 13 1. Kreisklasse",
    "region": "Frankfurt",
    "tableRank": 8,
    "matchesWon": 0,
    "matchesLost": 3
  }
}
```

### 2. Team Automatisch Konfigurieren

**Endpoint:** `POST /api/mytischtennis/configure-team`

**Request:**
```json
{
  "url": "https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer_TC_(J11)/spielerbilanzen/gesamt",
  "clubTeamId": 1,
  "createLeague": false,
  "createSeason": false
}
```

**Parameter:**
- `url` (required): Die myTischtennis-URL
- `clubTeamId` (required): Die ID des lokalen Club-Teams
- `createLeague` (optional): Wenn `true`, wird eine neue League erstellt
- `createSeason` (optional): Wenn `true`, wird eine neue Season erstellt

**Response:**
```json
{
  "success": true,
  "message": "Team configured successfully",
  "data": {
    "team": {
      "id": 1,
      "name": "Jugend 11",
      "myTischtennisTeamId": "2995094"
    },
    "league": {
      "id": 5,
      "name": "Jugend 13 1. Kreisklasse",
      "myTischtennisGroupId": "504417",
      "association": "HeTTV",
      "groupname": "1.Kreisklasse"
    },
    "season": {
      "id": 2,
      "name": "25/26"
    },
    "parsedData": { ... }
  }
}
```

### 3. URL für Team Abrufen

**Endpoint:** `GET /api/mytischtennis/team-url/:teamId`

**Response:**
```json
{
  "success": true,
  "url": "https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer%20TC%20%28J11%29/spielerbilanzen/gesamt"
}
```

## URL-Format

### Unterstützte URL-Muster

```
https://www.mytischtennis.de/click-tt/{association}/{season}/{type}/{groupname}/gruppe/{groupId}/mannschaft/{teamId}/{teamname}/...
```

**Komponenten:**
- `{association}`: Verband (z.B. "HeTTV", "DTTB", "WestD")
- `{season}`: Saison im Format "YY--YY" (z.B. "25--26" für 2025/2026)
- `{type}`: Typ (meist "ligen")
- `{groupname}`: Gruppenname URL-encoded (z.B. "1.Kreisklasse", "Kreisliga")
- `{groupId}`: Numerische Gruppen-ID (z.B. "504417")
- `{teamId}`: Numerische Team-ID (z.B. "2995094")
- `{teamname}`: Teamname URL-encoded mit Underscores (z.B. "Harheimer_TC_(J11)")

### Beispiel-URLs

**Spielerbilanzen:**
```
https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer_TC_(J11)/spielerbilanzen/gesamt
```

**Spielplan:**
```
https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer_TC_(J11)/spielplan
```

**Tabelle:**
```
https://www.mytischtennis.de/click-tt/HeTTV/25--26/ligen/1.Kreisklasse/gruppe/504417/mannschaft/2995094/Harheimer_TC_(J11)/tabelle
```

## Datenfluss

### Ohne MyTischtennis-Login

1. URL wird geparst
2. Nur URL-Komponenten werden extrahiert
3. Zusätzliche Daten (clubName, leagueName, etc.) sind nicht verfügbar

### Mit MyTischtennis-Login

1. URL wird geparst
2. API-Request an myTischtennis mit Authentication
3. Vollständige Team-Daten werden abgerufen
4. Alle Felder sind verfügbar

## Frontend-Integration

### Vue.js Beispiel

```javascript
<template>
  <div>
    <input 
      v-model="myTischtennisUrl" 
      placeholder="MyTischtennis URL einfügen..."
      @blur="parseUrl"
    />
    
    <div v-if="parsedData">
      <h3>{{ parsedData.teamname }}</h3>
      <p>Liga: {{ parsedData.leagueName }}</p>
      <p>Verband: {{ parsedData.association }}</p>
      <p>Tabelle: Platz {{ parsedData.tableRank }}</p>
      
      <button @click="configureTeam">Team konfigurieren</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      myTischtennisUrl: '',
      parsedData: null
    };
  },
  methods: {
    async parseUrl() {
      if (!this.myTischtennisUrl) return;
      
      try {
        const response = await fetch('/api/mytischtennis/parse-url', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'userid': this.userId,
            'authcode': this.authCode
          },
          body: JSON.stringify({
            url: this.myTischtennisUrl
          })
        });
        
        const result = await response.json();
        this.parsedData = result.data;
      } catch (error) {
        console.error('Fehler beim Parsen:', error);
        // Hinweis: Im Frontend stattdessen InfoDialog/ConfirmDialog verwenden
        // alert('URL konnte nicht geparst werden');
      }
    },
    
    async configureTeam() {
      try {
        const response = await fetch('/api/mytischtennis/configure-team', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'userid': this.userId,
            'authcode': this.authCode
          },
          body: JSON.stringify({
            url: this.myTischtennisUrl,
            clubTeamId: this.selectedTeamId,
            createLeague: false,
            createSeason: true
          })
        });
        
        const result = await response.json();
        
        if (result.success) {
          // In der Anwendung bitte InfoDialog nutzen
          // alert('Team erfolgreich konfiguriert!');
        } else {
          // alert('Team konnte nicht konfiguriert werden');
        }
      } catch (error) {
        console.error('Fehler bei Konfiguration:', error);
        // alert('Team konnte nicht konfiguriert werden');
      }
    }
  }
};
</script>
```

## Workflow

### Empfohlener Workflow für Benutzer

1. **MyTischtennis-URL kopieren:**
   - Auf myTischtennis.de zum Team navigieren
   - URL aus Adresszeile kopieren

2. **URL in Trainingstagebuch einfügen:**
   - Zu Team-Verwaltung navigieren
   - URL einfügen
   - Automatisches Parsen

3. **Konfiguration überprüfen:**
   - Geparste Daten werden angezeigt
   - Benutzer kann Daten überprüfen und bei Bedarf anpassen

4. **Team konfigurieren:**
   - Auf "Konfigurieren" klicken
   - System speichert alle benötigten IDs
   - Automatischer Datenabruf ist ab sofort aktiv

## Fehlerbehandlung

### Häufige Fehler

**"Invalid myTischtennis URL format"**
- URL entspricht nicht dem erwarteten Format
- Lösung: Vollständige URL von der Spielerbilanzen-Seite kopieren

**"Season not found"**
- Saison existiert noch nicht in der Datenbank
- Lösung: `createSeason: true` setzen

**"Team has no league assigned"**
- Team hat keine verknüpfte Liga
- Lösung: `createLeague: true` setzen oder Liga manuell zuweisen

**"HTTP 401: Unauthorized"**
- MyTischtennis-Login abgelaufen oder nicht vorhanden
- Lösung: In MyTischtennis-Settings erneut anmelden

## Sicherheit

- ✅ Alle Endpoints erfordern Authentifizierung
- ✅ UserID wird aus Header-Parameter gelesen
- ✅ MyTischtennis-Credentials werden sicher gespeichert
- ✅ Keine sensiblen Daten in URLs

## Technische Details

### Service: `myTischtennisUrlParserService`

**Methoden:**
- `parseUrl(url)` - Parst URL und extrahiert Komponenten
- `fetchTeamData(parsedUrl, cookie, accessToken)` - Ruft zusätzliche Daten ab
- `getCompleteConfig(url, cookie, accessToken)` - Kombination aus Parsen + Abrufen
- `isValidTeamUrl(url)` - Validiert URL-Format
- `buildUrl(config)` - Baut URL aus Komponenten

### Controller: `myTischtennisUrlController`

**Endpoints:**
- `POST /api/mytischtennis/parse-url` - URL parsen
- `POST /api/mytischtennis/configure-team` - Team konfigurieren
- `GET /api/mytischtennis/team-url/:teamId` - URL abrufen

## Zukünftige Erweiterungen

### Geplante Features

1. **Bulk-Import:**
   - Mehrere URLs gleichzeitig importieren
   - Alle Teams einer Liga auf einmal konfigurieren

2. **Auto-Discovery:**
   - Automatisches Finden aller Teams eines Vereins
   - Vorschläge für ähnliche Teams

3. **Validierung:**
   - Prüfung, ob Team bereits konfiguriert ist
   - Warnung bei Duplikaten

4. **History:**
   - Speichern der URL-Konfigurationen
   - Versionierung bei Änderungen

