import React, { useEffect, useState } from 'react';
import { View, Text, TextInput, Pressable } from 'react-native';
import * as SQLite from 'expo-sqlite';
import * as Crypto from 'expo-crypto';
import { Repository, HouseService, type House } from '../src/repository';
export default function Screen() {
  const [repository, setRepository] = useState<Repository | null>(null);
  const [rows, setRows] = useState<House[]>([]);
  const [name, setName] = useState(''); const [error, setError] = useState('');
  const [busy, setBusy] = useState(false);
  useEffect(() => {
    let alive = true; let database: SQLite.SQLiteDatabase | undefined;
    const startup = (async () => {
      try {
        database = await SQLite.openDatabaseAsync('house_learning.sqlite');
        const db = database;
        const repo = new Repository({
          exec: sql => db.execAsync(sql),
          run: async (sql, ...values) => { await db.runAsync(sql, ...values); },
          all: (sql, ...values) => db.getAllAsync(sql, ...values),
        });
        await repo.migrate(); const data = await repo.all();
        if (alive) { setRepository(repo); setRows(data); }
        else await db.closeAsync();
      } catch (_) { if (alive) setError('Cannot open storage'); }
    })();
    return () => { alive = false; void startup.finally(() => database?.closeAsync()).catch(() => undefined); };
  }, []);
  async function save() {
    if (!repository || busy) return;
    setBusy(true); setError('');
    try {
      await new HouseService(repository, Crypto.randomUUID).create(name);
      setRows(await repository.all()); setName('');
    } catch (_) { setError('Check name or storage'); }
    finally { setBusy(false); }
  }
  return <View style={{ padding: 24, gap: 16 }}>
    <Text>House learning</Text>
    <TextInput value={name} onChangeText={setName} accessibilityLabel="House name" />
    <Pressable disabled={!repository || busy} accessibilityRole="button" onPress={save}><Text>Save</Text></Pressable>
    <Text>{error}</Text>{rows.map(row => <Text key={row.id}>{row.name}</Text>)}
  </View>;
}
