import { Router } from 'express';
import bcrypt from 'bcryptjs';
import { db } from '../db.js';
import { authRequired, adminRequired } from '../middleware/auth.js';

export const usersRouter = Router();

// Все роуты управления пользователями — только для админа.
usersRouter.use(authRequired, adminRequired);

// GET /api/users — список всех пользователей
usersRouter.get('/', (req, res) => {
  const users = db.prepare(
    'SELECT id, email, role, created_at FROM users ORDER BY created_at DESC'
  ).all();
  res.json({ users });
});

// POST /api/users  { email, password, role } — создать пользователя
usersRouter.post('/', (req, res) => {
  const email = String(req.body?.email || '').trim().toLowerCase();
  const password = String(req.body?.password || '');
  const role = req.body?.role === 'admin' ? 'admin' : 'user';

  if (!email || !password) {
    return res.status(400).json({ error: 'Укажите email и пароль' });
  }
  if (password.length < 6) {
    return res.status(400).json({ error: 'Пароль должен быть не короче 6 символов' });
  }
  const exists = db.prepare('SELECT id FROM users WHERE email = ?').get(email);
  if (exists) {
    return res.status(409).json({ error: 'Пользователь с таким email уже существует' });
  }

  const hash = bcrypt.hashSync(password, 10);
  const info = db.prepare(
    'INSERT INTO users (email, password_hash, role) VALUES (?, ?, ?)'
  ).run(email, hash, role);
  // Заводим пустые профиль и почтовый аккаунт.
  db.prepare('INSERT INTO profiles (user_id) VALUES (?)').run(info.lastInsertRowid);
  db.prepare('INSERT INTO mail_accounts (user_id) VALUES (?)').run(info.lastInsertRowid);

  res.status(201).json({ user: { id: info.lastInsertRowid, email, role } });
});

// DELETE /api/users/:id — удалить пользователя (нельзя удалить самого себя)
usersRouter.delete('/:id', (req, res) => {
  const id = Number(req.params.id);
  if (id === req.user.id) {
    return res.status(400).json({ error: 'Нельзя удалить собственный аккаунт' });
  }
  const info = db.prepare('DELETE FROM users WHERE id = ?').run(id);
  if (info.changes === 0) {
    return res.status(404).json({ error: 'Пользователь не найден' });
  }
  res.json({ ok: true });
});
