from DepositAPI.libs.db.RDbSql import DbMySql
from DepositAPI.model.BaseModel import BaseModel
from DepositAPI.common.Utility import del_prop, get_prop
from datetime import datetime

class StoreManager(BaseModel):
    def get_detail(self, uid):
        self.table = "tbl_store_manager"
        self.primary_key = "ID"
        self.fields = ["ID", "BigPackageId", "TransactionCode", "FeeShip", "CreatedDate", "ModifiedDate", "CreatedBy", "ModifiedBy"]
        data = self.get_object_detail(uid)
        return data

    def get_list(self, filter, quickFilter, sortBy, descending, rowsPerPage, offset):
        where = self.build_query_by_filter(filter, quickFilter)
        self.fields = ["ID", "TransactionCode", "FeeShip", "Weight", "Volume", "CreatedDate", "CreatedBy"]
        self.table = "tbl_store_manager"
        self.primary_key = "ID"
        items, totalRow = self.get_list_objects(where, sortBy, descending, rowsPerPage, offset)
        return items, totalRow

    def get_package_by_bpid(self, bpid, sortBy, descending, rowsPerPage, offset):
        db = DbMySql()
        query_sql = (
            """SELECT ID, BigPackageId, TransactionCode, FeeShip, CreatedDate, ModifiedDate, CreatedBy, ModifiedBy  
               FROM tbl_store_manager 
               WHERE BigPackageId = %s ORDER BY %s %s LIMIT %s OFFSET %s;"""
            % (bpid, sortBy, descending, rowsPerPage, offset)
        )
        rows = db.query(query=query_sql)
        data = self.process_in_pandas(rows)
        return data
    
    def get_package_by_bpvnid(self, bpid, sortBy, descending, rowsPerPage, offset):
        db = DbMySql()
        query_sql = (
            """SELECT ID, BigPackageVNId, BigPackageCode, Status, NumberOfPack, Weight, Volume, TransactionCode, FeeShip, CreatedDate, ModifiedDate, CreatedBy, ModifiedBy  
               FROM tbl_store_manager 
               WHERE BigPackageVNId = %s ORDER BY %s %s LIMIT %s OFFSET %s;"""
            % (bpid, sortBy, descending, rowsPerPage, offset)
        )
        rows = db.query(query=query_sql)
        data = self.process_in_pandas(rows)
        return data

    def update(self, request, pk):
        db = DbMySql()
        self.table = "tbl_store_manager"
        self.primary_key = "ID"
        item = self.update_object_detail(request, pk)
        return item

    def insert(self, request):
        self.table = "tbl_store_manager"
        self.primary_key = "ID"
        row = self.insert_object_detail(request)
        return row
    
    def get_detail_by_trancode(self, trancode):
        db = DbMySql()
        query_sql = """ SELECT ID FROM tbl_store_manager WHERE LOWER(TransactionCode) = LOWER(:tran_code);"""
        query_param = {'tran_code': str(trancode).strip()}
        rows = db.query(query = query_sql, params=query_param)
        data = self.process_in_pandas(rows)
        return data[0] if len(data) > 0 else None

    def remove(self, pk):
        db = DbMySql()
        query_sql = """ DELETE FROM tbl_store_manager WHERE ID = %s;""" % (pk)
        rows = db.query(query=query_sql)
        return rows

    def update_multiple(self, request):
        is_create_bill = get_prop(request, 'IsCreateBill', True, False)
        transactions = get_prop(request, 'Transactions', True, [])
        username = get_prop(request, 'Username', True, '')
        uid = get_prop(request, 'UID', False, 0)
        db = DbMySql()
        # Tạo mới bao hàng tại kho VN
        bigpackage_obj = None
        if uid > 0 and is_create_bill:
            query_total = "SELECT COUNT(ID) as Count FROM tbl_bigpackage_vn WHERE DATE(CreatedDate) = CURDATE();"
            row_count = db.query_one(query=query_total)
            request.data["PackageCode"] = "%s-%s-%s" % (datetime.today().strftime('%d%m%Y'), username, str(row_count["Count"] + 1).zfill(3))
            self.table = "tbl_bigpackage_vn"
            self.primary_key = "ID"
            bigpackage_obj = self.insert_object_detail(request)
        for tran in transactions:
            query_sql = """ UPDATE tbl_store_manager SET UID = :uid, Username = :uname, ProductType = :product_type, Weight = :weight, Volume = :volume, StoreVNDate = NOW(), BigPackageVNId = :bigPackageVNId, BigPackageVNCode = :bigPackageVNCode  WHERE TransactionCode = :tran_code;"""
            query_param = {
                'tran_code': tran['TransactionCode'].strip().lower(), 
                'uid': tran['UID'], 
                'uname': tran['Username'], 
                'product_type': tran['ProductType'], 
                'weight': tran['Weight'], 
                'volume': tran['Volume'],
                'bigPackageVNId': bigpackage_obj['ID'] if bigpackage_obj is not None else 0, 
                'bigPackageVNCode': bigpackage_obj['PackageCode'] if bigpackage_obj is not None else ''
            }
            ret = db.query(query = query_sql, params=query_param)
            if ret.rowcount == 0:
                query_sql = """INSERT INTO tbl_store_manager(TransactionCode, UID, Username, ProductType, Weight, Volume, StoreVNDate, StoreTQDate, BigPackageVNId, BigPackageVNCode, CreatedBy)
                 VALUES(:tran_code, :uid, :uname, :product_type, :weight, :volume, NOW(), NOW(), :bigPackageVNId, :bigPackageVNCode, :created_by)"""
                query_param['created_by'] = request.user.username
                db.query(query = query_sql, params=query_param)
        return {"status": True}