from flask import request, jsonify
from db_config import get_db_connection
from datetime import datetime, timedelta

def get_calendar_by_user():
    try:
        user_id = request.args.get("user_id")
        if not user_id:
            return jsonify({"error": "Missing user_id"}), 400

        conn = get_db_connection()
        cursor = conn.cursor(dictionary=True)
        cursor.execute("""
            SELECT c.id, c.date_time, c.comment, w.title AS workout_title
            FROM calendars c
            JOIN workouts w ON c.workout_id = w.id
            WHERE c.user_id = %s
            ORDER BY c.date_time ASC
        """, (user_id,))
        entries = cursor.fetchall()
        cursor.close()
        conn.close()
        return jsonify(entries)
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def get_calendar_for_day():
    try:
        user_id = request.args.get("user_id")
        date = request.args.get("date")
        if not user_id or not date:
            return jsonify({"error": "Missing user_id or date"}), 400

        day_start = f"{date} 00:00:00"
        day_end = f"{date} 23:59:59"

        conn = get_db_connection()
        cursor = conn.cursor(dictionary=True)
        cursor.execute("""
            SELECT c.id, c.date_time, c.comment, w.title AS workout_title
            FROM calendars c
            JOIN workouts w ON c.workout_id = w.id
            WHERE c.user_id = %s AND c.date_time BETWEEN %s AND %s
            ORDER BY c.date_time ASC
        """, (user_id, day_start, day_end))
        results = cursor.fetchall()
        cursor.close()
        conn.close()
        return jsonify(results)
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def add_calendar_entry():
    try:
        data = request.json
        user_id = data.get("user_id")
        workout_id = data.get("workout_id")
        date_time = data.get("date_time")
        comment = data.get("comment")
        recurrence = data.get("recurrence")  # optional: daily, weekly, monthly repeat_count = int(data.get("repeat", 1))  # how many times to repeat

        if not user_id or not workout_id or not date_time:
            return jsonify({"error": "Missing user_id, workout_id or date_time"}), 400

        base_date = datetime.fromisoformat(date_time)

        conn = get_db_connection()
        cursor = conn.cursor()

        for i in range(repeat_count):
            repeat_date = base_date
            if recurrence == "daily":
                repeat_date = base_date + timedelta(days=i)
            elif recurrence == "weekly":
                repeat_date = base_date + timedelta(weeks=i)
            elif recurrence == "monthly":
                repeat_date = base_date.replace(month=base_date.month + i if base_date.month + i <= 12 else (base_date.month + i - 12))

            cursor.execute("""
                INSERT INTO calendars (user_id, workout_id, date_time, comment)
                VALUES (%s, %s, %s, %s)
            """, (user_id, workout_id, repeat_date.strftime('%Y-%m-%d %H:%M:%S'), comment))

        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"status": "Workout(s) scheduled"}), 201
    except Exception as e:
        return jsonify({"error": str(e)}), 500

def delete_calendar_entry():
    try:
        data = request.json
        calendar_id = data.get("calendar_id")
        if not calendar_id:
            return jsonify({"error": "Missing calendar_id"}), 400

        conn = get_db_connection()
        cursor = conn.cursor()
        cursor.execute("DELETE FROM calendars WHERE id = %s", (calendar_id,))
        conn.commit()
        cursor.close()
        conn.close()
        return jsonify({"status": "Calendar entry deleted"})
    except Exception as e:
        return jsonify({"error": str(e)}), 500
