// src/services/sessions.service.js
const chargersRepo = require('../repositories/chargers.repo');
const sessionsRepo = require('../repositories/sessions.repo');
const { httpError } = require('../utils/httpError');

function stripUndef(obj) {
  return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined));
}

async function listByCharger(userId, chargerId) {
  const charger = await chargersRepo.findByIdForUser(chargerId, userId);
  if (!charger) throw httpError(403, 'Acesso não autorizado');

  return sessionsRepo.listByCharger(chargerId);
}

async function history(userId, chargerId, viewMode) {
  const charger = await chargersRepo.findByIdForUser(chargerId, userId);
  if (!charger) throw httpError(403, 'Acesso não autorizado');

  const rows = await sessionsRepo.historyAgg(chargerId, viewMode);
  if (!rows.length) return [];

  return rows.map((r) => ({
    started_at: r.period,
    kwh: parseFloat(r.total_kwh) || 0,
  }));
}

async function getById(userId, sessionId) {
  const session = await sessionsRepo.findByIdForUser(sessionId, userId);
  if (!session) throw httpError(404, 'Sessão não encontrada');
  return session;
}

async function create(userId, charger_id) {
  const charger = await chargersRepo.findByIdForUser(charger_id, userId);
  if (!charger) throw httpError(403, 'Acesso não autorizado');

  return sessionsRepo.insertSession({ charger_id, started_at: new Date() });
}

async function update(userId, sessionId, patch) {
  const session = await sessionsRepo.findByIdForUser(sessionId, userId);
  if (!session) throw httpError(404, 'Sessão não encontrada');

  const clean = stripUndef(patch);
  return sessionsRepo.updateById(sessionId, clean);
}

async function remove(userId, sessionId) {
  const deleted = await sessionsRepo.deleteByIdForUser(sessionId, userId);
  if (!deleted) throw httpError(404, 'Sessão não encontrada');
  return true;
}

module.exports = { listByCharger, history, getById, create, update, remove };
