import type { Request, Response } from 'express';
import {
  DoctorScheduleNotFoundError,
  InvalidDoctorScheduleError,
  listAvailabilityDoctors,
  listDoctorAvailableSlots,
} from '../services/doctor-availability.service';

const resolveRouteParam = (value: string | string[] | undefined) => (Array.isArray(value) ? value[0] : value);

const handleAvailabilityError = (error: unknown, res: Response) => {
  if (error instanceof DoctorScheduleNotFoundError) {
    return res.status(404).json({ error: error.message });
  }

  if (error instanceof InvalidDoctorScheduleError) {
    return res.status(400).json({ error: error.message });
  }

  console.error('Error handling availability request:', error);
  return res.status(500).json({ error: 'Error interno del servidor' });
};

export const getAvailabilityDoctors = async (_req: Request, res: Response) => {
  try {
    const result = await listAvailabilityDoctors();
    res.setHeader('X-Data-Source', result.sourceMode);
    return res.json({ doctors: result.doctors });
  } catch (error) {
    return handleAvailabilityError(error, res);
  }
};

export const getDoctorAvailableSlotsController = async (req: Request, res: Response) => {
  const doctorUserId = resolveRouteParam(req.params.doctorUserId);
  const dateKey = typeof req.query.date === 'string' ? req.query.date : '';

  if (!doctorUserId) {
    return res.status(400).json({ error: 'Odontologo invalido' });
  }

  if (!dateKey) {
    return res.status(400).json({ error: 'Debes indicar la fecha a consultar.' });
  }

  try {
    const result = await listDoctorAvailableSlots(doctorUserId, dateKey);
    res.setHeader('X-Data-Source', result.sourceMode);
    return res.json({
      date: result.dateKey,
      effectiveSchedule: result.effectiveSchedule,
      slots: result.slots,
    });
  } catch (error) {
    return handleAvailabilityError(error, res);
  }
};
