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

// ─── User ────────────────────────────────────────────────────────────────────

// @desc    Check in
// @route   POST /api/attendance/check-in
export const checkIn = async (req: Request, res: Response): Promise<void> => {
  try {
    const result = await attendanceService.checkIn(req.user!.id);
    sendResponse(res, 200, 'Checked in successfully', result);
  } catch (error) { handleError(res, error); }
};

// @desc    Check out
// @route   POST /api/attendance/check-out
export const checkOut = async (req: Request, res: Response): Promise<void> => {
  try {
    const result = await attendanceService.checkOut(req.user!.id);
    sendResponse(res, 200, 'Checked out successfully', result);
  } catch (error) { handleError(res, error); }
};

// @desc    Get today's attendance status
// @route   GET /api/attendance/today
export const getTodayStatus = async (req: Request, res: Response): Promise<void> => {
  try {
    const status = await attendanceService.getTodayStatus(req.user!.id);
    sendResponse(res, 200, 'Today status fetched', status);
  } catch (error) { handleError(res, error); }
};

// @desc    Get my attendance history
// @route   GET /api/attendance/my?month=2026-04
export const getMyAttendance = async (req: Request, res: Response): Promise<void> => {
  try {
    const month = req.query.month as string | undefined;
    const result = await attendanceService.getMyAttendance(req.user!.id, month);
    sendResponse(res, 200, 'Attendance fetched', result);
  } catch (error) { handleError(res, error); }
};

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

// @desc    Get a user's attendance
// @route   GET /api/attendance/users/:id?month=2026-04
export const getUserAttendance = async (req: Request, res: Response): Promise<void> => {
  try {
    const month = req.query.month as string | undefined;
    const result = await attendanceService.getUserAttendance(req.params.id as string, month);
    sendResponse(res, 200, 'User attendance fetched', result);
  } catch (error) { handleError(res, error); }
};

// @desc    Get all attendance for a date
// @route   GET /api/attendance/date/:date?page=1&limit=20
export const getAttendanceByDate = async (req: Request, res: Response): Promise<void> => {
  try {
    const page = Math.max(1, parseInt(req.query.page as string) || 1);
    const limit = Math.min(50, Math.max(1, parseInt(req.query.limit as string) || 20));
    const { pagination, ...result } = await attendanceService.getAttendanceByDate(req.params.date as string, page, limit);
    sendResponse(res, 200, 'Attendance fetched', { count: result.records.length, ...result }, pagination);
  } catch (error) { handleError(res, error); }
};
