from micropie import App
from pickledb import AsyncPickleDB
from uuid import uuid4

db = AsyncPickleDB("pastes.db")


class PasteApp(App):
    async def paste(self, pid: str = None):
        if self.request.method == "POST":
            # Get content from JSON or form, depending on the Content-Type
            content = self.request.json("content")
            if content is None:
                content = self.request.form("content")
            pid = str(uuid4())
            await db.aset(pid, content)
            return {
                "status": "success",
                "action": "post",
                "paste_id": pid,
                "content": content,
            }

        elif self.request.method == "DELETE":
            await db.aremove(pid)
            return {"status": "success", "action": "delete", "paste_id": pid}

        elif self.request.method == "GET":
            if pid:
                paste = await db.aget(pid)
                if paste is None:
                    return 404, orjson.dumps(
                        {"status": "fail", "error": "Paste not found"}
                    )
                return {
                    "status": "success",
                    "action": "get",
                    "paste_id": pid,
                    "content": paste,
                }

            all_keys = await db.aall()
            all_pastes = [
                {"paste_id": key, "content": await db.aget(key)} for key in all_keys
            ]
            return 302, {"status": "success", "action": "get all", "pastes": all_pastes}


app = PasteApp()
