<?php
require_once 'vendor/autoload.php';

require_once 'model/MongoDBConnection.php';

require_once 'controller/JSONHelper.php';

require_once 'controller/TimeHelper.php';

class Invoice{
    private $collection;


    public function __construct() {
        // Lấy kết nối MongoDB
        $mongoDB = MongoDBConnection::getInstance();
        $this->collection = $mongoDB->getCollection('invoice');
    }

    private function processData($data){
        if (isset($data["id_chi_nhanh"]) && !empty($data["id_chi_nhanh"])){
            $data["id_chi_nhanh"] = new MongoDB\BSON\ObjectId($data["id_chi_nhanh"]);
        } else {
            return false;
        }

        if (isset($data["id_khach_hang"]) && !empty($data["id_khach_hang"])){
            $data["id_khach_hang"] = new MongoDB\BSON\ObjectId($data["id_khach_hang"]);
        } else {
            return false;
        }

        return $data;

    }

    private function findInvoice($id_chi_nhanh, $id_khach_hang, $is_luu_tru = false, $is_ban_si = false ){
        // Tạo filter tìm hóa đơn chưa hoàn tất & chưa lưu trữ
        $filter = [
            'id_chi_nhanh' => new MongoDB\BSON\ObjectId($id_chi_nhanh),
            'id_khach_hang' => new MongoDB\BSON\ObjectId($id_khach_hang),
            'is_done' => false,
            'is_ban_si' => $is_ban_si,
            'is_luu_tru' => $is_luu_tru
        ];

        // Lấy hóa đơn đầu tiên phù hợp
        $invoice = $this->collection->findOne(
            $filter,
            [
                'projection' => ['_id' => 1]
            ]
        );

        // Không tìm thấy
        if (!$invoice) {
            return null;
        }

        // Trả về _id dạng string
        return (string) $invoice['_id'];
    }


    public function addInvoice($data){

        $data["create_time"] = TimeHelper::getCurTime();
        $data["is_done"] = false;
        $data = $this->processData($data);

        if ($data == false)
            return $data; 

        $insertResult = $this->collection->insertOne($data);
        return (string) $insertResult->getInsertedId(); 
    }

    // Update: Cập nhật thông tin invoice
    public function updateInvoice($id, $data, $type = 'update') {
        $updateData = [];
        
        // Cập nhật thông tin cơ bản của invoice
        if ($type == 'update') {
            $data = $this->processData($data);
            $updateData = ['$set' => $data]; 
        }

        // Thêm bill vào invoice
        if ($type == 'add_bill' ) {
            $updateData = ['$push' => ['list_bill' => new MongoDB\BSON\ObjectId($data)]]; 
        }

        // Loại bỏ bill ra khỏi invoice
        if ($type == 'remove_bill') {
            $updateData = ['$pull' => ['list_bill' => new MongoDB\BSON\ObjectId($data)]]; 
        }

        // Cập nhật thông tin invoice
        $updateResult = $this->collection->updateOne(
            ['_id' => new MongoDB\BSON\ObjectId($id)],
            $updateData
        );
        
        return $updateResult->getModifiedCount(); // Trả về số bản ghi bị thay đổi
    }
}