import { Request, Response } from 'express';
import * as desktopSyncService from '../services/desktopSyncService';
import { sendResponse, handleError } from '../utils/apiResponse';

// @desc    Sync tracking_events / sessions / resource_usage / session_periods from the desktop app
// @route   POST /api/desktop/sync
export const syncDesktopData = async (req: Request, res: Response): Promise<void> => {
  try {
    const result = await desktopSyncService.syncDesktopData(req.user!.id, req.body);
    sendResponse(res, 200, 'Sync completed', result);
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Get my synced desktop tracking data
// @route   GET /api/desktop/sync
export const getMyDesktopSync = async (req: Request, res: Response): Promise<void> => {
  try {
    const limit = parseInt(req.query.limit as string) || undefined;
    const data = await desktopSyncService.getSyncDataForUser(req.user!.id, { limit });
    sendResponse(res, 200, 'Sync data fetched', data);
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Checkpoint an in-progress session (logout_time / running totals / status)
// @route   PATCH /api/desktop/sync
export const patchDesktopSession = async (req: Request, res: Response): Promise<void> => {
  try {
    const { session_id, ...updates } = req.body as { session_id?: number };
    if (session_id === undefined) {
      sendResponse(res, 400, 'Please provide session_id');
      return;
    }
    const session = await desktopSyncService.patchSyncSession(req.user!.id, session_id, updates);
    sendResponse(res, 200, 'Session updated', { session });
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Get an employee's synced desktop tracking data (admin)
// @route   GET /api/admin/desktop/sync/:employee_id
export const getEmployeeDesktopSync = async (req: Request, res: Response): Promise<void> => {
  try {
    const limit = parseInt(req.query.limit as string) || undefined;
    const data = await desktopSyncService.getSyncDataForEmployee(
      req.params.employee_id as string,
      { limit },
    );
    sendResponse(res, 200, 'Sync data fetched', data);
  } catch (error) {
    handleError(res, error);
  }
};
