from .database import DatabaseController
from models.products.product import Product


class ProductController(DatabaseController):
    FIELDS = ['id', 'name', 'image', 'description', 'cost',
              'sellerID', 'category', 'postedDate', 'quantityAvailable']

    def __init__(self):
        super().__init__()

    def create(self, product: Product):
        params = [
            product.name,
            product.image,
            product.description,
            product.cost,
            product.category,
            product.sellerID,
            product.postedDate,
            product.quantityAvailable
        ]

        self._conn.execute(
            """
            INSERT INTO Products
            (name, image, description, cost, categoryID,
            sellerID, postedDate, quantityAvailable)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)""",
            params
        )
        self._conn.commit()

    def read(self, name: str = "") -> list[Product] | None:
        params = [
            "%" + name + "%"
        ]

        cursor = self._conn.execute(
            "SELECT * FROM Products WHERE name like ?",
            params
        )
        rows = cursor.fetchmany()

        if rows is None:
            return None

        products = list()

        # Create an object for each row
        for product in rows:
            params = dict(zip(self.FIELDS, product))
            obj = self.new_instance(Product, params)
            products.append(obj)

        return products

    def read_id(self, id: int) -> Product | None:
        params = [
            id
        ]

        cursor = self._conn.execute(
            "SELECT * FROM Products WHERE id == ?",
            params
        )
        row = cursor.fetchone()

        if row is None:
            return None

        # Create an object with the row
        params = dict(zip(self.FIELDS, row))
        obj = self.new_instance(Product, params)

        return obj

    def read_all(self, category: str = "",
                 search_term: str = "") -> list[Product] | None:
        params = [
            "%" + category + "%",
            "%" + search_term + "%"
        ]

        cursor = self._conn.execute(
            """SELECT * FROM Products
            INNER JOIN Categories ON Products.categoryID = Categories.id
            WHERE Categories.name LIKE ?
            AND Products.name LIKE ?
            """,
            params
        )
        rows = cursor.fetchall()

        if len(rows) == 0:
            return None

        products = list()

        # Create an object for each row
        for product in rows:
            params = dict(zip(self.FIELDS, product))
            obj = self.new_instance(Product, params)
            products.append(obj)

        return products

    def read_user(self, user_id: int) -> list[Product] | None:
        params = [
            user_id
        ]

        cursor = self._conn.execute(
            """SELECT * FROM Products
            WHERE sellerID = ?
            """,
            params
        )
        rows = cursor.fetchall()

        if len(rows) == 0:
            return None

        products = list()

        # Create an object for each row
        for product in rows:
            params = dict(zip(self.FIELDS, product))
            obj = self.new_instance(Product, params)
            products.append(obj)

        return products

    def update(self, product: Product):
        params = [
            product.name,
            product.description,
            product.image,
            product.cost,
            product.quantityAvailable,
            product.category,
            product.id
        ]

        cursor = self._conn.execute(
            """UPDATE Products
            SET name = ?,
                description = ?,
                image = ?,
                cost = ?,
                quantityAvailable = ?,
                categoryID = ?
            WHERE id = ?
            """,
            params
        )
        self._conn.commit()

    def delete(self):
        print("Doing work")
