-- Schéma de la base de données SQLite pour Framed Tracker

-- Table des utilisateurs
CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL,           -- Mot de passe hashé avec bcrypt
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Index sur le nom d'utilisateur pour accélérer les recherches
CREATE UNIQUE INDEX idx_users_username ON users(username);

-- Table des scores
CREATE TABLE scores (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id INTEGER NOT NULL,         -- Référence à l'utilisateur
  date TEXT NOT NULL,               -- Date au format YYYY-MM-DD
  game_type TEXT NOT NULL,          -- "daily" ou "one"
  game_number INTEGER,              -- Numéro optionnel du jeu
  score INTEGER NOT NULL,           -- Score entre 1 et 6
  comment TEXT,                     -- Commentaire optionnel sur le jeu
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  
  -- Contrainte de clé étrangère pour assurer l'intégrité référentielle
  FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
);

-- Index sur user_id pour accélérer les recherches par utilisateur
CREATE INDEX idx_scores_user_id ON scores(user_id);

-- Index sur game_type pour accélérer les filtres par type de jeu
CREATE INDEX idx_scores_game_type ON scores(game_type);

-- Index composite pour les recherches fréquentes
CREATE INDEX idx_scores_user_game_type ON scores(user_id, game_type);

-- Vue pour les statistiques globales par utilisateur
CREATE VIEW user_stats AS
SELECT 
  user_id,
  COUNT(*) AS total_games,
  AVG(score) AS average_score,
  MIN(score) AS best_score
FROM scores
GROUP BY user_id;

-- Vue pour les statistiques par type de jeu et utilisateur
CREATE VIEW user_game_type_stats AS
SELECT 
  user_id,
  game_type,
  COUNT(*) AS total_games,
  AVG(score) AS average_score,
  MIN(score) AS best_score
FROM scores
GROUP BY user_id, game_type;

-- Vue pour le classement général
CREATE VIEW leaderboard AS
SELECT 
  u.id,
  u.username,
  COUNT(s.id) AS total_games,
  AVG(s.score) AS average_score,
  MIN(s.score) AS best_score
FROM users u
JOIN scores s ON u.id = s.user_id
GROUP BY u.id
ORDER BY average_score ASC, best_score ASC;

-- Vue pour le classement par type de jeu
CREATE VIEW leaderboard_by_type AS
SELECT 
  u.id,
  u.username,
  s.game_type,
  COUNT(s.id) AS total_games,
  AVG(s.score) AS average_score,
  MIN(s.score) AS best_score
FROM users u
JOIN scores s ON u.id = s.user_id
GROUP BY u.id, s.game_type
ORDER BY s.game_type, average_score ASC, best_score ASC;

-- Exemple d'insertion d'utilisateur (dans une application réelle, le mot de passe serait hashé)
-- INSERT INTO users (username, password) VALUES ('joueur1', 'motdepasse_hashed');

-- Exemple d'insertion de score
-- INSERT INTO scores (user_id, date, game_type, game_number, score) VALUES (1, '2025-03-05', 'daily', 1090, 3);
