import csv, sys
from datetime import datetime, timezone
from html.parser import HTMLParser

class Bookmarks(HTMLParser):
    def __init__(self):
        super().__init__()
        self.folders, self.pending, self.rows, self.link, self.text = [], None, [], None, ""

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == "dl":
            self.folders.append(self.pending or "")
            self.pending = None
        elif tag in ("a", "h3"):
            self.link = attrs if tag == "a" else None
            self.text = ""

    def handle_data(self, data):
        self.text += data

    def handle_endtag(self, tag):
        if tag == "h3":
            self.pending = self.text.strip()
        elif tag == "dl" and self.folders:
            self.folders.pop()
        elif tag == "a" and self.link and self.link.get("href", "").startswith("http"):
            added = self.link.get("add_date", "")
            created = datetime.fromtimestamp(int(added[:10]), timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") if added.isdigit() else ""
            folders = [name for name in self.folders if name]
            self.rows.append({"type": "link", "title": self.text.strip(), "source_url": self.link["href"],
                              "tags": ";".join(folders), "created_at": created})
            self.link = None

parser = Bookmarks()
with open(sys.argv[1], encoding="utf-8") as source:
    parser.feed(source.read())
with open("captures.csv", "w", newline="", encoding="utf-8") as target:
    writer = csv.DictWriter(target, fieldnames=["type", "title", "source_url", "tags", "created_at"])
    writer.writeheader()
    writer.writerows(parser.rows)
print(f"{len(parser.rows)} bookmarks written to captures.csv")
