#!/usr/bin/env python3
"""
Generate weekly summary from Notion tasks.

Usage:
    week                # Show this week's summary
    week --last         # Show last week's summary
"""

import argparse
import json
import os
import sys
import urllib.request
import urllib.error
from datetime import datetime, timedelta


NOTION_TOKEN = os.environ.get("NOTION_TOKEN")
DATABASE_ID = "YOUR-TASKS-DATABASE-ID-HERE"


def get_week_range(last_week=False):
    """Get start and end of current or last week."""
    today = datetime.now()

    # Start of current week (Monday)
    start_of_week = today - timedelta(days=today.weekday())

    if last_week:
        start_of_week = start_of_week - timedelta(days=7)

    end_of_week = start_of_week + timedelta(days=6)

    return start_of_week.strftime("%Y-%m-%d"), end_of_week.strftime("%Y-%m-%d")


def query_tasks(filter_obj):
    """Query tasks from Notion."""
    if not NOTION_TOKEN:
        print("❌ NOTION_TOKEN not set")
        sys.exit(1)

    data = {"filter": filter_obj}

    req = urllib.request.Request(
        f"https://api.notion.com/v1/databases/{DATABASE_ID}/query",
        data=json.dumps(data).encode("utf-8"),
        headers={
            "Authorization": f"Bearer {NOTION_TOKEN}",
            "Content-Type": "application/json",
            "Notion-Version": "2022-06-28",
        },
        method="POST",
    )

    try:
        with urllib.request.urlopen(req) as response:
            return json.loads(response.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        error_body = json.loads(e.read().decode("utf-8"))
        print(f"❌ Error: {e.code}")
        print(error_body.get("message", str(error_body)))
        sys.exit(1)


def get_property(page, prop_name, prop_type):
    """Extract property value from a Notion page."""
    prop = page.get("properties", {}).get(prop_name, {})

    if prop_type == "title":
        title_list = prop.get("title", [])
        return title_list[0].get("plain_text", "") if title_list else ""
    elif prop_type == "select":
        select = prop.get("select")
        return select.get("name", "") if select else ""
    elif prop_type == "status":
        status = prop.get("status")
        return status.get("name", "") if status else ""
    elif prop_type == "date":
        date = prop.get("date")
        return date.get("start", "") if date else ""
    return ""


def format_task(page):
    """Format a task for display."""
    title = get_property(page, "Task name", "title")
    project = get_property(page, "Project", "select")

    line = f"  • {title}"
    if project:
        line += f" [{project}]"

    return line


def main():
    parser = argparse.ArgumentParser(description="Weekly summary")
    parser.add_argument("--last", action="store_true", help="Show last week instead")

    args = parser.parse_args()

    start_date, end_date = get_week_range(args.last)
    today = datetime.now().strftime("%Y-%m-%d")

    # Header
    if args.last:
        print(f"📅 Last Week ({start_date} to {end_date})")
    else:
        print(f"📅 This Week ({start_date} to {end_date})")
    print("=" * 50)

    # Completed tasks (status = Done, check last_edited_time in range)
    # Note: We'll query Done tasks and filter by those edited this week
    completed_result = query_tasks({
        "property": "Status",
        "status": {"equals": "Done"}
    })
    completed_pages = completed_result.get("results", [])

    # Filter by last_edited_time (rough proxy for completion date)
    completed_this_week = []
    for page in completed_pages:
        edited = page.get("last_edited_time", "")[:10]
        if start_date <= edited <= end_date:
            completed_this_week.append(page)

    print(f"\n✅ Completed ({len(completed_this_week)})")
    print("-" * 30)
    if completed_this_week:
        for page in completed_this_week[:15]:
            print(format_task(page))
        if len(completed_this_week) > 15:
            print(f"  ... and {len(completed_this_week) - 15} more")
    else:
        print("  (none)")

    # Due this week (not done)
    due_result = query_tasks({
        "and": [
            {"property": "Status", "status": {"does_not_equal": "Done"}},
            {"property": "Due date", "date": {"on_or_after": start_date}},
            {"property": "Due date", "date": {"on_or_before": end_date}}
        ]
    })
    due_pages = due_result.get("results", [])

    print(f"\n📋 Due This Week ({len(due_pages)})")
    print("-" * 30)
    if due_pages:
        for page in due_pages:
            due = get_property(page, "Due date", "date")
            title = get_property(page, "Task name", "title")
            project = get_property(page, "Project", "select")

            overdue = "⚠️ " if due < today else ""
            line = f"  {overdue}• {title}"
            if project:
                line += f" [{project}]"
            line += f" (due: {due})"
            print(line)
    else:
        print("  (none)")

    # Overdue
    overdue_result = query_tasks({
        "and": [
            {"property": "Status", "status": {"does_not_equal": "Done"}},
            {"property": "Due date", "date": {"before": today}}
        ]
    })
    overdue_pages = overdue_result.get("results", [])

    if overdue_pages:
        print(f"\n⚠️  Overdue ({len(overdue_pages)})")
        print("-" * 30)
        for page in overdue_pages[:10]:
            print(format_task(page))
        if len(overdue_pages) > 10:
            print(f"  ... and {len(overdue_pages) - 10} more")

    # In Progress
    in_progress_result = query_tasks({
        "property": "Status",
        "status": {"equals": "In progress"}
    })
    in_progress_pages = in_progress_result.get("results", [])

    if in_progress_pages:
        print(f"\n🔄 In Progress ({len(in_progress_pages)})")
        print("-" * 30)
        for page in in_progress_pages:
            print(format_task(page))

    # Summary stats
    print("\n" + "=" * 50)
    print("Summary:")
    print(f"  Completed: {len(completed_this_week)}")
    print(f"  Due this week: {len(due_pages)}")
    print(f"  Overdue: {len(overdue_pages)}")
    print(f"  In progress: {len(in_progress_pages)}")


if __name__ == "__main__":
    main()
