class Request:
    def parse(self, xml):
        self.number = int(xml.get("id"))
        self.creator = xml.get("creator")
        self.state = xml.find("state").get("name")
        # not used in the database
        self.target = xml.find("action/target").get("project")

        self.type_ = xml.find("action").get("type")
        if self.type_ == "delete":
            self.source_package = None
            self.source_project = None
            self.source_rev = None
            # not much to do
            return self

        self.source_project = xml.find("action/source").get("project")
        self.source_package = xml.find("action/source").get("package")

        # expanded MD5 or commit revision
        self.source_rev = xml.find("action/source").get("rev")

        # TODO: support muti-action requests
        # TODO: parse review history
        # TODO: add description
        return self

    def type(self):
        return self.type_

    def __str__(self):
        return f"Req {self.number} {self.creator} {self.type_} {self.source_project} {self.state}"

    def __repr__(self):
        return f"[{self.__str__()}]"

    def import_into_db(self, db):
        with db.cursor() as cur:
            cur.execute(
                """INSERT INTO requests (number, creator, type, state, 
                    source_project, source_package, source_rev) 
                    VALUES (%s,%s,%s,%s,%s,%s,%s) RETURNING id""",
                (
                    self.number,
                    self.creator,
                    self.type_,
                    self.state,
                    self.source_project,
                    self.source_package,
                    self.source_rev,
                ),
            )
            rowid = cur.fetchone()[0]
            cur.execute(
                "UPDATE revisions SET request_id=%s WHERE request_number=%s",
                (rowid, self.number),
            )

    @staticmethod
    def find(db, request_id):
        with db.cursor() as cur:
            cur.execute("""SELECT * from requests WHERE id=%s""", (request_id,))
            row = cur.fetchone()
        return Request.from_db(row)

    @staticmethod
    def from_db(row):
        ret = Request()
        (
            ret.dbid,
            ret.number,
            ret.creator,
            ret.type_,
            ret.state,
            ret.source_package,
            ret.source_project,
            ret.source_rev,
        ) = row
        return ret

    def as_dict(self):
        return {
            "number": self.number,
            "creator": self.creator,
            "type": self.type_,
            "state": self.state,
            "source_project": self.source_project,
            "source_package": self.source_package,
            "source_rev": self.source_rev,
        }