#!/usr/bin/env python3
"""
Mark a task as complete in Notion.

Usage:
    done "[Journal] feedback"      # Search and mark matching task as done
    done --list               # Show recent tasks to mark done
"""

import argparse
import json
import os
import sys
import urllib.request
import urllib.error


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


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

    data = {
        "filter": {
            "property": "Status",
            "status": {"does_not_equal": "Done"}
        },
        "sorts": [
            {"property": "Due date", "direction": "ascending"}
        ]
    }

    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:
            result = json.loads(response.read().decode("utf-8"))
            pages = result.get("results", [])

            if search_term:
                search_lower = search_term.lower()
                pages = [p for p in pages if search_lower in get_title(p).lower()]

            return pages
    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_title(page):
    """Get task title from page."""
    title_prop = page.get("properties", {}).get("Task name", {}).get("title", [])
    return title_prop[0].get("plain_text", "") if title_prop else ""


def get_project(page):
    """Get project from page."""
    proj = page.get("properties", {}).get("Project", {}).get("select")
    return proj.get("name", "") if proj else ""


def mark_done(page_id):
    """Mark a task as done."""
    data = {
        "properties": {
            "Status": {"status": {"name": "Done"}}
        }
    }

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

    try:
        with urllib.request.urlopen(req) as response:
            return True
    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)))
        return False


def main():
    parser = argparse.ArgumentParser(description="Mark tasks as done")
    parser.add_argument("search", nargs="?", help="Search term to find task")
    parser.add_argument("--list", action="store_true", help="List recent incomplete tasks")

    args = parser.parse_args()

    if args.list:
        pages = query_tasks()[:15]
        if not pages:
            print("No incomplete tasks found.")
            return

        print("📋 Incomplete Tasks")
        print("-" * 40)
        for i, page in enumerate(pages, 1):
            title = get_title(page)
            project = get_project(page)
            line = f"{i:2}. {title}"
            if project:
                line += f" [{project}]"
            print(line)
        return

    if not args.search:
        parser.print_help()
        return

    pages = query_tasks(args.search)

    if not pages:
        print(f"No tasks found matching '{args.search}'")
        return

    if len(pages) == 1:
        page = pages[0]
        title = get_title(page)
        if mark_done(page["id"]):
            print(f"✅ Done: {title}")
    else:
        print(f"Found {len(pages)} matching tasks:")
        print("-" * 40)
        for i, page in enumerate(pages, 1):
            title = get_title(page)
            project = get_project(page)
            line = f"{i}. {title}"
            if project:
                line += f" [{project}]"
            print(line)

        print()
        try:
            choice = input("Which one? (number or 'q' to cancel): ").strip()
            if choice.lower() == 'q':
                print("Cancelled.")
                return

            idx = int(choice) - 1
            if 0 <= idx < len(pages):
                page = pages[idx]
                title = get_title(page)
                if mark_done(page["id"]):
                    print(f"✅ Done: {title}")
            else:
                print("Invalid choice.")
        except (ValueError, KeyboardInterrupt):
            print("\nCancelled.")


if __name__ == "__main__":
    main()
