const bookingModel = require('../models/bookingModel');

exports.getAppointmentPage = async (req, res) => {
    try {
        const services = await bookingModel.getAllServices();
        res.render('customer/appointmentPage', { services });
    } catch (error) {
        console.error(error);
        res.status(500).send('เกิดข้อผิดพลาดในการดึงข้อมูลบริการ');
    }
};

exports.searchService = async (req, res) => {
  const query = req.query.query;
  try {
    
    const services = await bookingModel.searchServices(query);

    
    res.render('customer/appointmentPage', { services, query }); // Pass query for display on the page
  } catch (error) {
    console.error(error);
    res.status(500).send('เกิดข้อผิดพลาดในการค้นหาบริการ');
  }
};

exports.bookNow = (req, res) => {
    res.redirect('/customer/selectTime');
};

exports.getSelectTimePage = async (req, res) => {
    try {
        const services = await bookingModel.getAllServices();
        res.render('customer/selectTime', { services });
    } catch (error) {
        console.error(error);
        res.status(500).send('เกิดข้อผิดพลาดในการดึงข้อมูลสำหรับการเลือกเวลา');
    }
};

exports.getBookingSlots = async (req, res) => {
    try {
        const date = req.query.date;
        if (!date) {
            return res.status(400).json({ error: 'กรุณาระบุวันที่' });
        }
        const slots = await bookingModel.getBookingSlotsByDate(date);
        res.json(slots);
    } catch (error) {
        console.error(error);
        res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึงข้อมูลช่วงเวลา' });
    }
};

exports.confirmBooking = async (req, res) => {
  const { service, date, time } = req.body;

  try {
      const serviceData = await bookingModel.getServiceById(service);
      
      if (!serviceData) {
          throw new Error(`ไม่พบข้อมูลบริการสำหรับ service_id: ${service}`);
      }

      req.session.bookingData = { serviceId: service, serviceName: serviceData.service_name, date, time };
      res.render('customer/confirmBooking', { bookingData: req.session.bookingData });
  } catch (error) {
      console.error(error);
      res.status(500).send(`เกิดข้อผิดพลาด: ${error.message}`);
  }
};


exports.completeBooking = async (req, res) => {
  try {
    const { note } = req.body;
    const bookingData = req.session.bookingData;
    if (!bookingData) {
      return res.status(400).send('ไม่พบข้อมูลการจองใน session');
    }
    
    const user_id = req.session.userId;
    if (!user_id) {
      return res.status(401).send("Unauthorized: ไม่พบข้อมูลผู้ใช้");
    }
    // ค้นหา booking slot ตามวันที่และเวลา
    const slot = await bookingModel.getBookingSlotByDateAndTime(bookingData.date, bookingData.time);

    // สร้าง appointment ใหม่
    const appointmentData = {
      user_id,
      service_id: bookingData.serviceId,
      booking_slot_id: slot.booking_slot_id,
      appointment_status: 'Waiting for Deposit',
      note
    };

    const appointmentId = await bookingModel.createAppointment(appointmentData);

    // อัปเดต booking slot ให้ไม่ว่าง
    await bookingModel.updateBookingSlot(slot.booking_slot_id);

    // สร้าง payment record ใหม่
    await bookingModel.createPayment(appointmentId);

    // ล้างข้อมูลการจองจาก session (ถ้าจำเป็น)
    req.session.bookingData = null;

    res.redirect('/customer/bookingSummary?id=' + appointmentId);
  } catch (error) {
    console.error(error);
    res.status(500).send('เกิดข้อผิดพลาดในการบันทึกการจอง');
  }
};

exports.bookingSummary = async (req, res) => {
  try {
    const appointmentId = req.query.id;
    if (!appointmentId) {
      return res.status(400).send("ไม่พบรหัสการจอง");
    }
    // ดึงข้อมูลการจอง
    const appointment = await bookingModel.getAppointmentById(appointmentId);
    // ดึงข้อมูลผู้ใช้
    const user = await bookingModel.getUserById(appointment.user_id);
    // ดึงข้อมูลบริการ
    const service = await bookingModel.getServiceById(appointment.service_id);
    // ดึงข้อมูล booking slot
    const slot = await bookingModel.getBookingSlotById(appointment.booking_slot_id);
    // Render หน้า bookingSummary.ejs พร้อมส่งข้อมูลที่ต้องการ
    res.render('customer/bookingSummary', { appointment, user, service, slot });
  } catch (error) {
    console.error(error);
    res.status(500).send("เกิดข้อผิดพลาดในการแสดงสรุปการจอง");
  }
};

exports.getAllAppointmentPage = async (req, res) => {
  try {
      const user_id = req.session.userId;
      
      // ดึงข้อมูลการจองจากฐานข้อมูล
      const waitingForDeposit = await bookingModel.getAppointmentsByStatus(user_id, 'Waiting for Deposit');
      const waitingForService = await bookingModel.getAppointmentsByStatus(user_id, 'Waiting for Service');
      const completed = await bookingModel.getAppointmentsFromHistory(user_id, 'Completed');  
      const cancelled = await bookingModel.getAppointmentsFromHistory(user_id, 'Cancelled');
  
      // ส่งข้อมูลไปยังหน้าการจอง
      res.render('customer/allAppointments', {
          appointments: {
              waitingForDeposit,
              waitingForService,
              completed,
              cancelled
          }
      });
  } catch (error) {
      console.error(error);
      res.status(500).send('เกิดข้อผิดพลาดในการดึงข้อมูลการจอง');
  }
};


exports.cancelAppointment = async (req, res) => {
  try {
      const { appointmentId } = req.body;

      // ตรวจสอบสถานะการชำระเงิน
      const paymentStatus = await bookingModel.getPaymentStatusByAppointmentId(appointmentId);

      if (paymentStatus === 'Pending') {
          // ย้ายข้อมูลไป appointment_history พร้อม `payment_status`
          await bookingModel.addToHistory(appointmentId);
          res.send('ยกเลิกการจองสำเร็จ และย้ายไปยังประวัติการนัดหมาย');
      } else {
          res.status(400).send('ไม่สามารถยกเลิกการจองได้ เนื่องจากการชำระเงินเสร็จสมบูรณ์');
      }
  } catch (error) {
      console.error(error);
      res.status(500).send('เกิดข้อผิดพลาดในการยกเลิกการจอง');
  }
};