const BaseController = require('./base.controller');
const { Agendamiento } = require('../models');
const { Op } = require('sequelize');

class AgendamientoController extends BaseController {
  constructor() {
    super(Agendamiento, 'Agendamiento', ['PacienteAgendado', 'DoctorAsignado', 'Servicio']);
  }

  // Obtener por paciente
  getByPaciente = async (req, res, next) => {
    try {
      const { pacienteId } = req.params;
      const data = await Agendamiento.findAndCountAll({
        where: { PacienteId: pacienteId },
        order: [['FechayHoraInicio', 'DESC']]
      });
      const count = data.length;
      if (count === 0) {
        return res.json(
          {
            success: false,
            message: 'No se encontraron agendamientos para este paciente',
            data: [],
            total: 0
          }
        );
      }
      res.json({
        success: true,
        message: 'Agendamientos obtenidos exitosamente',
        data: data,
        total: count
      });
    } catch (error) {
      next(error);
    }
  };

  // Obtener por doctor
  getByDoctor = async (req, res, next) => {
    try {
      const { doctorId } = req.params;

      const data = await Agendamiento.findAndCountAll({
        where: { DoctorId: doctorId },
        order: [['FechayHoraInicio', 'ASC']]
      });
      const count = data.length;
      if (count === 0) {
        return res.json(
          {
            success: false,
            message: 'No se encontraron agendamientos para este doctor',
            data: [],
            total: 0
          }
        );
      }
      res.json({
        success: true,
        message: 'Agendamientos obtenidos exitosamente',
        data: data,
        total: count
      });
    } catch (error) {
      next(error);
    }
  };

  // Obtener por fecha
  getByFecha = async (req, res, next) => {
    try {
      const { fecha } = req.params;
      const data = await Agendamiento.findAll({
        where: {
          FechayHoraInicio: {
            [Op.startsWith]: fecha
          }
        },
        order: [['FechayHoraInicio', 'ASC']]
      });
      const count = data.length;
      if (count === 0) {
        return res.json(
          {
            success: false,
            message: 'No se encontraron agendamientos para esta fecha',
            data: [],
            total: 0
          }
        );
      }
      res.json({
        success: true,
        message: 'Agendamientos obtenidos exitosamente',
        data: data,
        total: count
      });
    } catch (error) {
      next(error);
    }
  };

  // Obtener por estado
  getByEstado = async (req, res, next) => {
    try {
      const { estado } = req.params;
      const data = await Agendamiento.findAndCountAll({
        where: { Estado: estado },
        order: [['FechayHoraInicio', 'DESC']]
      });
      const count = data.length;
      if (count === 0) {
        return res.json(
          {
            success: false,
            message: 'No se encontraron agendamientos para este estado',
            data: [],
            total: 0
          }
        );
      }
      res.json({
        success: true,
        message: 'Agendamientos obtenidos exitosamente',
        ...response
      });
    } catch (error) {
      next(error);
    }
  };
}

module.exports = new AgendamientoController();