import { Request, Response } from "express";
import * as employeeTrackerService from "../services/employeeTracker";
import { sendResponse, handleError } from "../utils/apiResponse";

const parsePagination = (req: Request, defaultLimit = 50) => {
  const page = Math.max(1, parseInt(req.query.page as string) || 1);
  const limit = Math.min(
    100,
    Math.max(1, parseInt(req.query.limit as string) || defaultLimit),
  );
  return { page, limit };
};

// ─── Employee ────────────────────────────────────────────────────────────────

// @desc    Get the selectable break types
// @route   GET /api/desktop/break-types
export const getBreakTypes = async (
  _req: Request,
  res: Response,
): Promise<void> => {
  try {
    const breakTypes = employeeTrackerService.getBreakTypes();
    sendResponse(res, 200, "Break types fetched", { break_types: breakTypes });
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Log a typed break against the current working session
// @route   POST /api/desktop/break
export const createBreak = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { type, start_time, end_time, duration_seconds, ip_address, os_info, device_name } = req.body;
    const session = await employeeTrackerService.createBreak(
      req.user!.id,
      type,
      start_time,
      end_time,
      duration_seconds,
      ip_address,
      os_info,
      device_name,
    );
    sendResponse(res, 201, "Break logged", session);
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Log a desktop tracking event
// @route   POST /api/desktop/session
export const createSession = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { log_type, timestamp, ip_address, os_info, device_name } = req.body;
    const session = await employeeTrackerService.createSession(
      req.user!.id,
      log_type,
      timestamp,
      ip_address,
      os_info,
      device_name,
    );
    sendResponse(res, 201, "Session logged", session);
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Get my desktop sessions
// @route   GET /api/desktop/sessions
export const getMySessions = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { page, limit } = parsePagination(req);
    const { sessions, pagination } = await employeeTrackerService.getMySessions(
      req.user!.id,
      page,
      limit,
    );
    sendResponse(
      res,
      200,
      "Sessions fetched",
      { count: sessions.length, sessions },
      pagination,
    );
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Get my per-day attendance summary (checkin/checkout/work/break/idle/interrupted/total)
// @route   GET /api/desktop/day-summary?from_date=2026-09-01&to_date=2026-09-30
export const getMyDaySummary = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { page, limit } = parsePagination(req, 10);
    const { from_date, to_date } = req.query;
    const { days, pagination } = await employeeTrackerService.getMyDaySummary(
      req.user!.id,
      page,
      limit,
      typeof from_date === "string" ? from_date : undefined,
      typeof to_date === "string" ? to_date : undefined,
    );
    sendResponse(res, 200, "Day summary fetched", { count: days.length, days }, pagination);
  } catch (error) {
    handleError(res, error);
  }
};

// ─── Admin ───────────────────────────────────────────────────────────────────

// @desc    Get all desktop sessions
// @route   GET /api/admin/desktop/sessions
export const getAllSessions = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { page, limit } = parsePagination(req);
    const { sessions, pagination } =
      await employeeTrackerService.getAllSessions(page, limit);
    sendResponse(
      res,
      200,
      "Sessions fetched",
      { count: sessions.length, sessions },
      pagination,
    );
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Get desktop sessions for a specific employee
// @route   GET /api/admin/desktop/session/:employee_id
export const getEmployeeSessions = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const { page, limit } = parsePagination(req);
    const { sessions, pagination } = await employeeTrackerService.getEmployeeSessions(
      req.params.employee_id as string,
      page,
      limit,
    );
    sendResponse(
      res,
      200,
      "Sessions fetched",
      { count: sessions.length, sessions },
      pagination,
    );
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Delete desktop session records older than one month
// @route   DELETE /api/admin/desktop/sessions
export const deleteOldSessions = async (
  req: Request,
  res: Response,
): Promise<void> => {
  try {
    const result = await employeeTrackerService.deleteOldSessions();
    sendResponse(
      res,
      200,
      `Deleted ${result.deletedCount} session record(s) older than one month`,
      result,
    );
  } catch (error) {
    handleError(res, error);
  }
};
