import logging
import pytz
import requests
from datetime import datetime, timedelta
from apscheduler.schedulers.background import BackgroundScheduler
from django.core.mail import send_mail
from django.conf import settings

logger = logging.getLogger(__name__)

# ---------------------------------------------
# TIMEZONE & CONFIG
# ---------------------------------------------
OMAN_TZ = pytz.timezone("Asia/Muscat")
ALERT_BEFORE = 60
CHECK_EVERY = 60

scheduler_started = False
_alerted_ids = set()

# ---------------------------------------------
# EMAIL HTML - COLORFUL & VIBRANT NEW DESIGN
# ---------------------------------------------
def build_email_html(customer_name, net_selection, start_str):
    return f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>BSC Cricket Academy - Booking Reminder</title>
</head>
<body style="margin:0; padding:0; background:#f1f5f9; font-family: Arial, sans-serif;">

<table width="100%" cellpadding="0" cellspacing="0" style="background:#f1f5f9; padding: 30px 0;">
  <tr>
    <td align="center">
      <table width="520" cellpadding="0" cellspacing="0" style="max-width:520px; width:100%; border-radius:16px; overflow:hidden; border: 1px solid #e2e8f0;">

        <!-- TOP ACCENT LINE -->
        <tr>
          <td style="background:#ee4d0f; height:5px; font-size:0; line-height:0;">&nbsp;</td>
        </tr>

        <!-- HEADER -->
        <tr>
          <td style="background: linear-gradient(135deg, #ff6b35 0%, #f7c948 100%); padding: 28px 28px 22px;">
            <table width="100%" cellpadding="0" cellspacing="0">
              <tr>
                <td style="width:50px; vertical-align:middle;">
                  <div style="width:46px; height:46px; background:rgba(255,255,255,0.25); border-radius:50%; text-align:center; line-height:46px; font-size:22px;">
                    🏏
                  </div>
                </td>
                <td style="padding-left:12px; vertical-align:middle;">
                  <p style="margin:0; font-size:18px; font-weight:700; color:white; letter-spacing:0.5px;">BSC CRICKET ACADEMY</p>
                  <p style="margin:4px 0 0; font-size:12px; color:rgba(255,255,255,0.85);">Booking Reminder</p>
                </td>
              </tr>
            </table>
          </td>
        </tr>

        <!-- BODY -->
        <tr>
          <td style="background:#ffffff; padding:26px 28px;">

            <p style="margin:0 0 4px; font-size:13px; color:#64748b;">Hello,</p>
            <p style="margin:0 0 22px; font-size:17px; font-weight:700; color:#0f172a;">{customer_name}</p>

            <!-- REMINDER CARD -->
            <table width="100%" cellpadding="0" cellspacing="0" style="background:#fff8f0; border:1.5px solid #ff6b35; border-radius:14px; margin-bottom:22px;">
              <tr>
                <td style="padding:20px 22px;">

                  <table cellpadding="0" cellspacing="0" style="margin-bottom:16px;">
                    <tr>
                      <td style="font-size:18px; vertical-align:middle; padding-right:8px;">🔔</td>
                      <td style="font-size:12px; font-weight:700; color:#ff6b35; letter-spacing:0.5px; vertical-align:middle; text-transform:uppercase;">
                        Your session starts in 1 hour
                      </td>
                    </tr>
                  </table>

                  <table width="100%" cellpadding="0" cellspacing="0">
                    <tr>
                      <!-- NET CARD -->
                      <td width="48%" style="background:#ffffff; border-radius:10px; border:1px solid #ffe0cc; padding:14px 16px; vertical-align:top;">
                        <p style="margin:0 0 6px; font-size:11px; color:#999999; text-transform:uppercase; letter-spacing:0.5px;">Net</p>
                        <table cellpadding="0" cellspacing="0">
                          <tr>
                            <td style="font-size:18px; vertical-align:middle; padding-right:6px;">🏟️</td>
                            <td style="font-size:20px; font-weight:700; color:#ff6b35; vertical-align:middle;">{net_selection}</td>
                          </tr>
                        </table>
                      </td>
                      <td width="4%"></td>
                      <!-- TIME CARD -->
                      <td width="48%" style="background:#ffffff; border-radius:10px; border:1px solid #ffe0cc; padding:14px 16px; vertical-align:top;">
                        <p style="margin:0 0 6px; font-size:11px; color:#999999; text-transform:uppercase; letter-spacing:0.5px;">Start Time</p>
                        <table cellpadding="0" cellspacing="0">
                          <tr>
                            <td style="font-size:18px; vertical-align:middle; padding-right:6px;">⏰</td>
                            <td style="font-size:20px; font-weight:700; color:#ff6b35; vertical-align:middle;">{start_str}</td>
                          </tr>
                        </table>
                      </td>
                    </tr>
                  </table>

                </td>
              </tr>
            </table>

            <!-- GREEN NOTE -->
            <table width="100%" cellpadding="0" cellspacing="0" style="background:#f0fdf4; border-radius:10px; border:1px solid #bbf7d0; margin-bottom:22px;">
              <tr>
                <td style="padding:14px 16px;">
                  <table cellpadding="0" cellspacing="0">
                    <tr>
                      <td style="font-size:18px; vertical-align:top; padding-right:10px; padding-top:2px;">✅</td>
                      <td style="font-size:14px; line-height:1.6; color:#15803d;">
                        Please arrive <strong>10 minutes early</strong> and bring your gear. Enjoy your session at BSC Cricket Academy!
                      </td>
                    </tr>
                  </table>
                </td>
              </tr>
            </table>

            <!-- CONTACT -->
            <table width="100%" cellpadding="0" cellspacing="0">
              <tr>
                <td style="border-top:1px dashed #e2e8f0; padding-top:16px; font-size:12px; color:#94a3b8;">
                  📞 Questions? Call us at <strong style="color:#ff6b35;">+968 9XXX XXXX</strong>
                </td>
              </tr>
            </table>

          </td>
        </tr>

        <!-- FOOTER -->
        <tr>
          <td style="background:#1e1b18; padding:16px 24px;">
            <table width="100%" cellpadding="0" cellspacing="0">
              <tr>
                <td style="font-size:11px; color:#9ca3af;">© 2026 BSC Cricket Academy. All rights reserved.</td>
                <td align="right" style="font-size:14px; color:#9ca3af; letter-spacing:6px;">📸 💬</td>
              </tr>
            </table>
          </td>
        </tr>

      </table>
    </td>
  </tr>
</table>

</body>
</html>
    """

# ---------------------------------------------
# PUSH NOTIFICATION
# ---------------------------------------------
def send_push_notification(expo_token, title, body):
    try:
        response = requests.post(
            "https://exp.host/--/api/v2/push/send",
            json={
                "to": expo_token,
                "title": title,
                "body": body,
                "sound": "default",
            },
            headers={"Content-Type": "application/json"},
            timeout=10
        )
        logger.info(f"🔔 PUSH RESPONSE: {response.json()}")
    except Exception as e:
        logger.error(f"❌ PUSH ERROR: {e}")

# ---------------------------------------------
# TIME STRING PARSER - FIXED
# "4:30 pm", "4:30pm", "04:30PM", "16:30", "16:30:00" எல்லாம் handle ஆகும்
# ---------------------------------------------
def parse_time_string(raw):
    cleaned = raw.strip()
    cleaned = cleaned.replace("\u202f", "").replace(" ", "")
    cleaned = cleaned.upper()  # "4:30pm" → "4:30PM" ✅

    time_obj = None

    if "AM" in cleaned or "PM" in cleaned:
        for fmt in ("%I:%M%p", "%I:%M:%S%p"):
            try:
                time_obj = datetime.strptime(cleaned, fmt).time()
                break
            except ValueError:
                continue
    else:
        for fmt in ("%H:%M:%S", "%H:%M"):
            try:
                time_obj = datetime.strptime(cleaned, fmt).time()
                break
            except ValueError:
                continue

    return time_obj

# ---------------------------------------------
# MAIN SCHEDULER FUNCTION
# ---------------------------------------------
def attendance():
    from myapp.models import Booking, Profiles

    try:
        now_oman = datetime.now(OMAN_TZ)
        today_oman = now_oman.date()

        target_datetime = now_oman + timedelta(minutes=ALERT_BEFORE)
        target_hour = target_datetime.hour
        target_minute = target_datetime.minute

        logger.info(f"⏳ SCHEDULER CHECKING - Current Oman Time: {now_oman.strftime('%H:%M:%S')}")
        logger.info(f"🎯 TARGET BOOKING TIME TO MATCH: {target_hour:02d}:{target_minute:02d}")

        upcoming_bookings = Booking.objects.filter(booking_date=today_oman)
        found_count = 0
        alert_sent_count = 0

        for booking in upcoming_bookings:
            try:
                if not booking.start_time:
                    continue

                if isinstance(booking.start_time, str):
                    time_obj = parse_time_string(booking.start_time)
                    if time_obj is None:
                        logger.error(
                            f"❌ INVALID TIME FORMAT IN DB FOR ID {booking.id}: "
                            f"'{booking.start_time}' — Could not parse."
                        )
                        continue
                else:
                    time_obj = booking.start_time

                b_hour = time_obj.hour
                b_minute = time_obj.minute

                if b_hour != target_hour or b_minute != target_minute:
                    continue

                found_count += 1

                if booking.id in _alerted_ids:
                    logger.info(f"⏭️ SKIP DUPLICATE ALERT for Booking ID: {booking.id}")
                    continue

                start_str = time_obj.strftime("%I:%M %p")

                # -----------------------------
                # EMAIL SENDING
                # -----------------------------
                if booking.email:
                    try:
                        subject = f"🏏 BSC Cricket Academy - {booking.net_selection} starts at {start_str}"
                        html = build_email_html(booking.customer_name, booking.net_selection, start_str)

                        send_mail(
                            subject=subject,
                            message="",
                            from_email=settings.EMAIL_HOST_USER,
                            recipient_list=[booking.email],
                            html_message=html,
                            fail_silently=False,
                        )
                        logger.info(f"📧 EMAIL SUCCESS -> Sent to: {booking.email} | Booking ID: {booking.id}")
                    except Exception as mail_err:
                        logger.error(f"❌ EMAIL FAILED for {booking.email} | Booking ID {booking.id}: {mail_err}")
                else:
                    logger.warning(f"⚠️ EMAIL SKIP -> No email found for Booking ID: {booking.id}")

                # -----------------------------
                # PUSH NOTIFICATION
                # -----------------------------
                try:
                    
                    
                    profiles = Profiles.objects.exclude(pincode=None).exclude(pincode="")
                    
                    if profiles.exists():  # ✅ for...else இல்லை, if/else use பண்றோம்
                        for profile in profiles:
                            send_push_notification(
                                expo_token=profile.pincode,
                                title="🏏 BSC Cricket Academy",
                                body=f"Hi {booking.customer_name}, {booking.net_selection} starts at {start_str}. Please be ready!"
                            )
                        logger.info(f"📱 PUSH SUCCESS -> Sent to: {booking.customer_name} | Booking ID: {booking.id}")
                    else:
                        logger.warning(f"⚠️ PUSH SKIP -> No expo token found | Booking ID: {booking.id}")
                        
                except Exception as push_err:
                    logger.error(f"❌ PUSH ERROR for Booking ID {booking.id}: {push_err}")

                _alerted_ids.add(booking.id)
                alert_sent_count += 1

            except Exception as loop_err:
                logger.error(f"❌ BOOKING LOOP ERROR (ID: {getattr(booking, 'id', 'Unknown')}): {loop_err}")

        logger.info(f"📊 MATCHED: {found_count} bookings | ALERTS SENT: {alert_sent_count}")

        if len(_alerted_ids) > 1000:
            _alerted_ids.clear()
            logger.info("🧹 MEMORY CLEANUP: _alerted_ids cleared.")

    except Exception as main_err:
        logger.error(f"❌ ATTENDANCE FUNCTION CRASHED: {main_err}")

# ---------------------------------------------
# START SCHEDULER
# ---------------------------------------------
def attendance1():
    global scheduler_started
    if scheduler_started:
        logger.warning("⚠️ SCHEDULER: Already running. Skipping duplicate startup.")
        return

    try:
        scheduler = BackgroundScheduler(timezone=OMAN_TZ)
        scheduler.add_job(
            attendance,
            trigger="interval",
            seconds=CHECK_EVERY,
            id="booking_alert",
            replace_existing=True,
        )
        scheduler.start()
        scheduler_started = True
        logger.info("🚀 SCHEDULER STARTED: Oman Booking Alert Engine is ACTIVE.")
    except Exception as e:
        logger.error(f"❌ SCHEDULER START FAILED: {e}")