#!/usr/bin/env python3
import re
import requests
from typing import List, Dict, Optional

config = {
    "displayName": "JawZ Art",
    "blocks": [
        {
            "id": "aaakxm4a5pbcs",
            "type": "input",
            "inputType": "did",
            "did": "did:plc:3y42h6r3t4rfnxc57jtcw5lk",
        },
        {
            "id": "aaakxm4a5ozyu",
            "type": "regex",
            "value": "#(?i)art",
            "caseSensitive": False,
            "invert": False,
        },
        {"id": "aaakxm4a5nze6", "type": "sort", "sortType": "created_at"},
    ],
}


def get_api_data(endpoint: str, params: Optional[Dict] = None) -> Optional[Dict]:
    if not endpoint:
        return None
    response = requests.get(endpoint, params=params)
    if response.status_code != 200:
        return None
    return response.json()


def filter_by_did(posts: List[Dict], did: str) -> List[Dict]:
    if not posts or not did:
        return []
    return [post for post in posts if post.get("author", {}).get("did") == did]


def regex_filter(posts: List[Dict], pattern: str) -> List[Dict]:
    if not posts or not pattern:
        return []
    compiled_pattern = re.compile(pattern)
    return [post for post in posts if compiled_pattern.search(post.get("content", ""))]


def sort_posts(posts: List[Dict], key: str = "created_at") -> List[Dict]:
    return sorted(posts, key=lambda x: x.get(key, ""), reverse=True)


def generate_feed(endpoint: str, config: Dict) -> Optional[List[Dict]]:
    data = get_api_data(endpoint)
    print(data)
    if not data:
        return None

    posts = data.get("posts", [])
    did_block = next(
        (block for block in config["blocks"] if block["type"] == "input"), {}
    )
    regex_block = next(
        (block for block in config["blocks"] if block["type"] == "regex"), {}
    )
    sort_block = next(
        (block for block in config["blocks"] if block["type"] == "sort"), {}
    )

    posts = filter_by_did(posts, did_block.get("did", "")) if did_block else posts
    posts = regex_filter(posts, regex_block.get("value", "")) if regex_block else posts
    posts = (
        sort_posts(posts, key=sort_block.get("sortType", "created_at"))
        if sort_block
        else posts
    )
    return posts


def main():
    endpoint = "https://api.bsky.app/feeds"
    feed = generate_feed(endpoint, config)
    if not feed:
        return
    print(feed)


if __name__ == "__main__":
    main()
