<?php

namespace App\Services;

use App\Models\CustomDiscount;

class CustomDiscountRuleService
{
    public function getActiveDiscounts($contact)
    {
        $discounts = CustomDiscount::active()
            ->valid() // date check
            ->orderBy('setPriority', 'desc')
            ->get();
        return $discounts;
    }

    private function checkDiscountQuantity($discount, $quantity){
        if ($discount->minBuyQty && $quantity < $discount->minBuyQty) {
            return false;
        }
        if ($discount->maxBuyQty && $quantity > $discount->maxBuyQty) {
            return false;
        }
        return true;
    }

    private function checkCouponCode($discount, $appliedDiscounts = [])
    {
        // If discount has no coupon code, it's automatically applicable
        if (empty($discount->couponCode)) {
            return true;
        }

        // If discount has a coupon code, check if it's in the applied discounts
        if (!empty($appliedDiscounts) && is_array($appliedDiscounts)) {
            foreach ($appliedDiscounts as $appliedDiscount) {
                if (isset($appliedDiscount) && $appliedDiscount === $discount->couponCode) {
                    return true;
                }
            }
        }

        return false;
    }

    private function checkFilters($discount, $product, $variation, $quantity){
        $filter = $discount->filter ?? [];
        $filter = json_decode($filter, true);
         // filter by category
         if(isset($filter['categories'])){
            $productCategoryIds = $product->webcategories->pluck('id')->toArray();
            if($filter['categories']['opration'] == 'in'){
                if(array_intersect($productCategoryIds, $filter['categories']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }else{
                if(!array_intersect($productCategoryIds, $filter['categories']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }
        }

        // filter by brand
        if(isset($filter['brands'])){
            if($filter['brands']['opration'] == 'in'){
                if(in_array($product->brand->id, $filter['brands']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }else{
                if(!in_array($product->brand->id, $filter['brands']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }
        }

        // filter by product
        if(isset($filter['product_ids'])){
            if($filter['product_ids']['opration'] == 'in'){
                if(in_array($product->id, $filter['product_ids']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }else{
                if(!in_array($product->id, $filter['product_ids']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }
        }

        // filter by variation
        if(isset($filter['variation_ids'])){
            if($filter['variation_ids']['opration'] == 'in'){
                if(in_array($variation->id, $filter['variation_ids']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }else{
                if(!in_array($variation->id, $filter['variation_ids']['ids'])){
                    if($this->checkDiscountQuantity($discount, $quantity)){
                        return true;
                    }
                }
            }
        }
    }

    public function isDiscountApplicable($discount, $product, $variation, $quantity, $appliedDiscounts = [])
    {
        // First check if coupon code is required and valid
        if (!$this->checkCouponCode($discount, $appliedDiscounts)) {
            return false;
        }

        $discountType = $discount->discountType;
        if ($discountType === 'productAdjustment') {
            if($this->checkFilters($discount, $product, $variation, $quantity)){
                return true;
            }
        }

        // if($discountType == 'cartAdjustment'){
        //     if($this->checkFilters($discount, $product, $variation, $quantity)){
        //         return true;
        //     }
        // }

        if($discountType == 'freeShipping'){
            if($this->checkFilters($discount, $product, $variation, $quantity)){
                return true;
            }
        }
        if($discountType == 'buyXgetX'){
            if($this->checkFilters($discount, $product, $variation, $quantity)){
                return true;
            }
        }
        if($discountType == 'buyXgetY'){
            if($this->checkFilters($discount, $product, $variation, $quantity)){
                return true;
            }
        }
        return false;
    }

    public function calculateDiscountedPrice($price, $discount)
    {
        $discountType = $discount->discount;
        switch ($discountType) {
            case 'percentageDiscount':
                return round($price * (1 - ($discount->discountValue / 100)), 2);
            case 'fixedDiscount':
                return max(0, $price - $discount->discountValue);
            case 'fixedPricePerItem':
                return $discount->discountValue;
            case 'free':
                return 0;
            default:
                return $price;
        }
    }
}