<?php
require_once 'vendor/autoload.php';

require_once 'model/MongoDBConnection.php';
require_once 'model/CachDung.php';
require_once 'model/NhaSanXuat.php';

require_once 'controller/JSONHelper.php';

class HangHoa{
    private $collection;

    // Constructor để lấy collection 'bill'
    public function __construct() {
        // Lấy kết nối MongoDB
        $mongoDB = MongoDBConnection::getInstance();
        $this->collection = $mongoDB->getCollection('hang_hoa');
    }

    // Create: Thêm hàng hoá mới
    public function addHangHoa($data) {
        // Thêm id_don_vi và id_cach_dung, id_nha_san_xuat vào dữ liệu thú cưng
        if (isset($data["id_don_vi"]) && !empty($data["id_don_vi"])){
            $data["id_don_vi"] = new MongoDB\BSON\ObjectId($data["id_don_vi"]);
        }
        if (isset($data["id_cach_dung"]) && !empty($data["id_cach_dung"])){
            $data["id_cach_dung"] = new MongoDB\BSON\ObjectId($data["id_cach_dung"]);
        }
        if (isset($data["id_nha_san_xuat"]) && !empty($data["id_nha_san_xuat"])){
            $data["id_nha_san_xuat"] = new MongoDB\BSON\ObjectId($data["id_nha_san_xuat"]);
        }
        

        $insertResult = $this->collection->insertOne($data);
        return $insertResult->getInsertedId(); // Trả về _id của hàng hoá mới
    }

    // Update: Cập nhật thông tin hàng hoá mai làm lại
    public function updateHangHoa($id, $data) {
        
        if (isset($data["id_don_vi"]) && !empty($data["id_don_vi"])){
            $data["id_don_vi"] = new MongoDB\BSON\ObjectId($data["id_don_vi"]);
        }
        if (isset($data["id_cach_dung"]) && !empty($data["id_cach_dung"])){
            $data["id_cach_dung"] = new MongoDB\BSON\ObjectId($data["id_cach_dung"]);
        }
        if (isset($data["id_nha_san_xuat"]) && !empty($data["id_nha_san_xuat"])){
            $data["id_nha_san_xuat"] = new MongoDB\BSON\ObjectId($data["id_nha_san_xuat"]);
        }

        $updateResult = $this->collection->updateOne(
            ['_id' => new MongoDB\BSON\ObjectId($id)],
            ['$set' => $data] // Cập nhật thông tin hàng hoá
        );
        return $updateResult->getModifiedCount(); // Số bản ghi bị thay đổi
    }

    // DELETE: Xóa hàng hoá
    public function deleteHangHoa($id) {
        $deleteResult = $this->collection->deleteOne(['_id' => new MongoDB\BSON\ObjectId($id)]);
        return $deleteResult->getDeletedCount(); // Trả về số bản ghi đã bị xóa
    }

    public function getAllHangHoa() {
        $pipeline = [
            [
                '$lookup' => [
                    'from' => 'don_vi',   // Tên collection 'don_vi'
                    'localField' => 'id_don_vi',  // Trường tham chiếu trong collection 'hang_hoa'
                    'foreignField' => '_id',   // Trường trong collection 'don_vi'
                    'as' => 'don_vi_info'   // Tên trường chứa kết quả kết hợp
                ]
            ],
            [
                '$lookup' => [
                    'from' => 'cach_dung',   // Tên collection 'cach_dung'
                    'localField' => 'id_cach_dung',  // Trường tham chiếu trong collection 'hang_hoa'
                    'foreignField' => '_id',   // Trường trong collection 'cach_dung'
                    'as' => 'cach_dung_info'   // Tên trường chứa kết quả kết hợp
                ]
            ],
            [
                '$lookup' => [
                    'from' => 'nha_san_xuat',   // Tên collection 'nha_san_xuat'
                    'localField' => 'id_nha_san_xuat',  // Trường tham chiếu trong collection 'hang_hoa'
                    'foreignField' => '_id',   // Trường trong collection 'nha_san_xuat'
                    'as' => 'nha_san_xuat_info'   // Tên trường chứa kết quả kết hợp
                ]
            ],
            [
                '$addFields' => [
                    'cach_dung' => [
                        '$arrayElemAt' => ['$cach_dung_info.ten_cach_dung', 0]  
                    ],
                    'don_vi' => [
                        '$arrayElemAt' => ['$don_vi_info.ten_don_vi', 0]  
                    ],
                    'nha_san_xuat' => [
                        '$arrayElemAt' => ['$nha_san_xuat_info.ten_nha_san_xuat', 0]  
                    ]
                ]
            ],
            [
            '$project' => [
                // Loại bỏ 'id_don_vi' và 'id_cach_dung' và 'id_nha_san_xuat'
                'id_don_vi' => 0,  
                'id_cach_dung' => 0, 
                'id_nha_san_xuat' => 0,

                'don_vi_info' => 0,
                'cach_dung_info' => 0,
                'nha_san_xuat_info' => 0
                ]
            ]
        ];

        // Thực thi pipeline
        $cursor = $this->collection->aggregate($pipeline);
        $result = iterator_to_array($cursor);
        $result = JSONHelper::objectToJson($result);

        return  $result; 
    }

    private function getLieuLuongThuoc($id, $trongLuong){
        $item = $this->collection->findOne(['_id' => new MongoDB\BSON\ObjectId($id)]);

        if ($item && isset($item['lieu_luong'])&& $item['lieu_luong_enable']==1){
            foreach ($item['lieu_luong'] as $lieuLuong) {
                // Nếu có "trong_luong_max" trong phạm vi
                if (isset($lieuLuong['trong_luong_max'])){
                    if ($trongLuong >= $lieuLuong['trong_luong_min'] && $trongLuong <= $lieuLuong['trong_luong_max']) {
                        return [
                            'lieu_luong' => $lieuLuong['lieu_luong'],
                            'lieu_luong_max' => $lieuLuong['lieu_luong_max']
                        ];
                    }
                } else {
                    if ($trongLuong >= $lieuLuong['trong_luong_min']) {
                        return [
                            'lieu_luong' => $lieuLuong['lieu_luong'],
                            'lieu_luong_max' => $lieuLuong['lieu_luong_max']
                        ];
                    }
                }                  
            }
        } if ($item && isset($item['lieu_luong_ty_trong']) && $item['lieu_luong_ty_trong_enable']==1){
            return [ 
                'lieu_luong_ty_trong' => round($item['lieu_luong_ty_trong'] * $trongLuong, 2)
            ];
        }

        return null;

    }

    public function getHangHoa($id, $trongLuong = 0, $isFrontEnd = false ){
        $pipeline = [
            // Tìm kiếm theo ID (chuyển đổi ID thành ObjectId nếu cần)
            [
                '$match' => [
                    '_id' => new MongoDB\BSON\ObjectId($id)  // Tìm kiếm bằng ObjectId
                ]
            ],
            // Kết hợp với collection 'don_vi'
            [
                '$lookup' => [
                    'from' => 'don_vi',
                    'localField' => 'id_don_vi',
                    'foreignField' => '_id',
                    'as' => 'don_vi_info'
                ]
            ],
            // Kết hợp với collection 'cach_dung'
            [
                '$lookup' => [
                    'from' => 'cach_dung',
                    'localField' => 'id_cach_dung',
                    'foreignField' => '_id',
                    'as' => 'cach_dung_info'
                ]
            ],
            [
                '$limit' => 1 
            ],
            [
                '$project' => [
                    'id_hang_hoa' => 1,
                    'ten_hang_hoa' => 1,
                    'is_thuoc' => 1,
                    'don_vi' => ['$arrayElemAt' => ['$don_vi_info.ten_don_vi', 0]],
                    'cach_dung' => ['$arrayElemAt' => ['$cach_dung_info.ten_cach_dung', 0]],
                    'gia_hang_hoa' => 1
                ]
            ]
        ];

        // Thực thi pipeline
        $cursor = $this->collection->aggregate($pipeline);
        $result = iterator_to_array($cursor);

        if (isset($result[0]["is_thuoc"])&& $trongLuong > 0){
            if ($result[0]["is_thuoc"] == 1){
                // Kết hợp 2 đối tượng
                $result = (object) array_merge((array) $result, (array) $this->getLieuLuongThuoc($id, $trongLuong));
            } 
        }       
        

        if (isset($result)){
            if ($isFrontEnd){
                return JSONHelper::objectToJson($result);
            } else {
                return $result;
            }
        } else{
            return null;
        }

    }
}
?>