#!/usr/bin/env python3
"""
Agrega campos nuevos a las colecciones de PocketBase.

v2:
  - users.meet_link        (sala fija de videollamada para la profe)
  - classes.notes_student  (notas privadas del alumno)
  - classes.notes_shared   (notas compartidas, solo la profe edita)

v3:
  - classes.class_type     (select: online | presencial, default: online)
  - classes.address        (text: dirección para clases presenciales)

Uso:
  python3 add_features.py
"""
import urllib.request, urllib.parse, json, getpass

PB_URL = 'http://localhost:8091'

email = input('Superuser email: ')
password = getpass.getpass('Superuser password: ')

def pb_req(method, path, data=None, token=None):
    url = f'{PB_URL}/api/{path}'
    body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(url, data=body, method=method)
    req.add_header('Content-Type', 'application/json')
    if token:
        req.add_header('Authorization', token)
    try:
        with urllib.request.urlopen(req) as r:
            return json.loads(r.read()), r.status
    except urllib.error.HTTPError as e:
        body = e.read()
        try:
            return json.loads(body), e.code
        except Exception:
            return {'raw': body.decode()}, e.code

# ── Auth ──────────────────────────────────────────────────────────────────────
resp, status = pb_req('POST', 'collections/_superusers/auth-with-password',
    {'identity': email, 'password': password})
if status != 200:
    print(f'✗ Auth fallida (HTTP {status}): {resp}')
    exit(1)
token = resp['token']
print('✓ Autenticado\n')

# ── Helpers ───────────────────────────────────────────────────────────────────
def get_collection(name):
    resp, status = pb_req('GET', f'collections/{name}', token=token)
    if status != 200:
        print(f'  ✗ No se encontró la colección "{name}": {resp}')
        return None
    return resp

def add_field(collection_name, field):
    col = get_collection(collection_name)
    if not col:
        return False
    existing = [f['name'] for f in col.get('fields', [])]
    if field['name'] in existing:
        print(f'  → {field["name"]} ya existe en {collection_name}, se omite')
        return True
    fields = col.get('fields', [])
    fields.append(field)
    resp, status = pb_req('PATCH', f'collections/{collection_name}',
        {'fields': fields}, token=token)
    if status in (200, 204):
        print(f'  ✓ Agregado: {collection_name}.{field["name"]}')
        return True
    else:
        print(f'  ✗ Error agregando {collection_name}.{field["name"]} (HTTP {status}): {resp}')
        return False

# ── Cambios ───────────────────────────────────────────────────────────────────
print('Agregando campos...\n')

# Feature 1: sala fija de Meet de la profe
add_field('users', {
    'name': 'meet_link',
    'type': 'url',
    'required': False,
})

# Feature 2: sistema de notas de tres niveles
add_field('classes', {
    'name': 'notes_student',
    'type': 'text',
    'required': False,
})

add_field('classes', {
    'name': 'notes_shared',
    'type': 'text',
    'required': False,
})

# Feature v3: modalidad de clase
add_field('classes', {
    'name': 'class_type',
    'type': 'select',
    'required': False,
    'maxSelect': 1,
    'values': ['online', 'presencial'],
})

add_field('classes', {
    'name': 'address',
    'type': 'text',
    'required': False,
})

# Feature v4: Google Calendar event ID
add_field('classes', {
    'name': 'gcal_event_id',
    'type': 'text',
    'required': False,
})

# Feature v5: créditos de clase
add_field('classes', {
    'name': 'duration_credits',
    'type': 'number',
    'required': False,
})

# Colección class_credits
def create_collection_if_missing(name, definition):
    resp, status = pb_req('GET', f'collections/{name}', token=token)
    if status == 200:
        print(f'  → colección "{name}" ya existe, se omite')
        return
    resp, status = pb_req('POST', 'collections', definition, token=token)
    if status in (200, 204):
        print(f'  ✓ Colección creada: {name}')
    else:
        print(f'  ✗ Error creando "{name}" (HTTP {status}): {resp}')

create_collection_if_missing('class_credits', {
    'name': 'class_credits',
    'type': 'base',
    'fields': [
        {'name': 'student_id', 'type': 'relation', 'required': True,
         'collectionId': '_pb_users_auth_', 'maxSelect': 1, 'cascadeDelete': False},
        {'name': 'amount',     'type': 'number',   'required': True},
        {'name': 'type',       'type': 'select',   'required': True,
         'maxSelect': 1, 'values': ['purchase', 'debit']},
        {'name': 'description','type': 'text',     'required': True},
        {'name': 'date',       'type': 'text',     'required': True},
        {'name': 'class_id',   'type': 'relation', 'required': False,
         'collectionId': 'classes', 'maxSelect': 1, 'cascadeDelete': False},
    ],
    'listRule':   "@request.auth.id != ''",
    'viewRule':   "@request.auth.id != ''",
    'createRule': "@request.auth.id != ''",
    'updateRule': "@request.auth.rol = 'teacher'",
    'deleteRule': "@request.auth.rol = 'teacher'",
})

print('\n✅ Listo. Reiniciá la app o recargá el panel de PocketBase.')
print('   Los nuevos campos aparecen en las colecciones "users" y "classes".')
print('   Nueva colección: "class_credits".')
