package com.project.whatsappchatbot.controller;

import com.project.whatsappchatbot.controller.BotController.WhatsAppBotController;
import com.project.whatsappchatbot.model.Order;
import com.project.whatsappchatbot.model.PaymentLink;
import com.project.whatsappchatbot.model.Service;
import com.project.whatsappchatbot.repository.OrderRepository;
import com.project.whatsappchatbot.repository.PaymentLinkRepository;
import com.project.whatsappchatbot.repository.ServiceRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import javax.annotation.PostConstruct;

@Component
public class PaymentLinkNotificationScheduler {

    @Autowired
    private PaymentLinkRepository paymentLinkRepository;

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private RazorpayController razorpayController;

    @Autowired
    private ServiceRepository serviceRepository;
    @Value("${phone.notification.numbers}")
    private String notificationNumbers;

    private List<String> notificationNumberList;

    @PostConstruct
    public void initPhonesNotificationNumber() {
        if (notificationNumbers != null && !notificationNumbers.isBlank()) {
        	notificationNumberList = Arrays.asList(notificationNumbers.split(","));
        } else {
            notificationNumberList = new ArrayList<>();
        }
    }

    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Scheduled(cron = "0 0 8 * * ?", zone = "Asia/Kolkata")
    public void notifyUnpaidPaymentLinks() {
        LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Kolkata"));
        System.out.println("Running daily check for unpaid payment links at: " + now.format(DATE_TIME_FORMATTER));

        List<PaymentLink> unpaidLinks = paymentLinkRepository.findUnpaidPaymentLinks();
        if (!unpaidLinks.isEmpty()) {
            StringBuilder adminMessageBuilder = new StringBuilder();

            for (PaymentLink unpaidLink : unpaidLinks) {
                String orderId = unpaidLink.getOrderId();
                String contactNumber = unpaidLink.getContactNumber();
                double amount = unpaidLink.getAmount();
                String serviceName = "General Service";

                Order order = orderRepository.findById(Long.valueOf(unpaidLink.getOrderId())).orElse(null);

                if (order != null) {
                    Optional<Service> optionalService = serviceRepository.findById(order.getServiceId());
                    if (optionalService.isPresent()) {
                        Service service = optionalService.get();
                        serviceName = service.getName();
                    }
                }

                // Send reminder message to the client
                WhatsAppBotController.sendReminderMessageTemplate(contactNumber, orderId, serviceName, amount + "0", contactNumber, unpaidLink.getPaymentLink());

                // Append the current unpaid link details to the admin message
                adminMessageBuilder.append("*Reminder: Payment Pending*\n")
                        .append("⚙ Service: ").append(serviceName).append("\n")
                        .append("🆔 Order ID: ").append(orderId).append("\n")
                        .append("💵 Amount: ").append(amount).append("0").append("\n")
                        .append("📞 Contact: ").append(contactNumber).append("\n")
                        .append("🔗 Payment Link: ").append(unpaidLink.getPaymentLink()).append("\n")
                        .append("\n");  // Adding a line break between each reminder
            }

            // Send the accumulated admin message
            String adminMessage = adminMessageBuilder.toString();
            for (String adminNumber : notificationNumberList) {
                razorpayController.sendTextMessage(adminNumber, adminMessage);
            }

            System.out.println("Unpaid payment reminders sent.");
        } else {
            System.out.println("No unpaid payment links found.");
        }
    }
}
