-- +goose Up
DELIMITER //

DROP PROCEDURE IF EXISTS get_full_product //

CREATE PROCEDURE get_full_product(
    IN p_id_product INT UNSIGNED,
    IN p_id_shop INT UNSIGNED,
    IN p_id_lang INT UNSIGNED,
    IN p_id_customer INT UNSIGNED,
    IN p_id_group INT UNSIGNED,
    IN p_id_currency INT UNSIGNED,
    IN p_id_country INT UNSIGNED,
    IN p_quantity INT UNSIGNED
)
BEGIN

    DECLARE v_tax_rate DECIMAL(10,4) DEFAULT 0;

   SELECT COALESCE(t.rate, 0.0000) INTO v_tax_rate
FROM ps_tax_rule tr
INNER JOIN ps_tax t 
    ON t.id_tax = tr.id_tax
WHERE tr.id_tax_rules_group = (
    SELECT ps.id_tax_rules_group 
    FROM ps_product_shop ps  
    WHERE ps.id_product = p_id_product
      AND ps.id_shop = p_id_shop   
    LIMIT 1
)
  AND tr.id_country = p_id_country
ORDER BY 
    tr.id_state DESC,          
    tr.zipcode_from != '' DESC, 
    tr.id_tax_rule DESC        
LIMIT 1;

    /* FINAL JSON */
    SELECT JSON_OBJECT(

        /* ================= PRODUCT ================= */
        'id_product', p.id_product,
        'reference', p.reference,
        'name', pl.name,
        'description', pl.description,
        'short_description', pl.description_short,

        /* ================= PRICE ================= */
        'price', JSON_OBJECT(
            'base', COALESCE(ps.price, p.price),

            'final_tax_excl',
            (
                COALESCE(ps.price, p.price)
                - IFNULL(
                    CASE 
                        WHEN sp.reduction_type = 'amount' THEN sp.reduction
                        WHEN sp.reduction_type = 'percentage' THEN COALESCE(ps.price, p.price) * sp.reduction
                        ELSE 0
                    END, 0
                )
            ),

            'final_tax_incl',
            (
                (
                    COALESCE(ps.price, p.price)
                    - IFNULL(
                        CASE 
                            WHEN sp.reduction_type = 'amount' THEN sp.reduction
                            WHEN sp.reduction_type = 'percentage' THEN COALESCE(ps.price, p.price) * sp.reduction
                            ELSE 0
                        END, 0
                    )
                ) * (1 + v_tax_rate / 100)
            )
        ),

        /* ================= META ================= */
        'active', COALESCE(ps.active, p.active),
        'visibility', COALESCE(ps.visibility, p.visibility),
        'manufacturer', m.name,
        'category', cl.name,

        /* ================= IMAGE ================= */
        'cover_image', JSON_OBJECT(
            'id', i.id_image,
            'legend', il.legend
        ),

        /* ================= FEATURES ================= */
        'features', (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'name', fl.name,
                    'value', fvl.value
                )
            )
            FROM ps_feature_product fp
            JOIN ps_feature_lang fl 
                ON fl.id_feature = fp.id_feature AND fl.id_lang = p_id_lang
            JOIN ps_feature_value_lang fvl 
                ON fvl.id_feature_value = fp.id_feature_value AND fvl.id_lang = p_id_lang
            WHERE fp.id_product = p.id_product
        ),

        /* ================= COMBINATIONS ================= */
        'combinations', (
            SELECT JSON_ARRAYAGG(
                JSON_OBJECT(
                    'id_product_attribute', pa.id_product_attribute,
                    'reference', pa.reference,

                    'price', JSON_OBJECT(
                        'impact', COALESCE(pas.price, pa.price),

                        'final_tax_excl',
                        (
                            COALESCE(ps.price, p.price)
                            + COALESCE(pas.price, pa.price)
                        ),

                        'final_tax_incl',
                        (
                            (
                                COALESCE(ps.price, p.price)
                                + COALESCE(pas.price, pa.price)
                            ) * (1 + v_tax_rate / 100)
                        )
                    ),

                    'stock', IFNULL(sa.quantity, 0),

                    'default_on', pas.default_on,

                    /* ATTRIBUTES JSON */
                    'attributes', (
                        SELECT JSON_ARRAYAGG(
                            JSON_OBJECT(
                                'group', agl.name,
                                'attribute', al.name
                            )
                        )
                        FROM ps_product_attribute_combination pac
                        JOIN ps_attribute a ON a.id_attribute = pac.id_attribute
                        JOIN ps_attribute_lang al 
                            ON al.id_attribute = a.id_attribute AND al.id_lang = p_id_lang
                        JOIN ps_attribute_group_lang agl 
                            ON agl.id_attribute_group = a.id_attribute_group AND agl.id_lang = p_id_lang
                        WHERE pac.id_product_attribute = pa.id_product_attribute
                    ),

                    /* IMAGES */
                    'images', (
                        SELECT JSON_ARRAYAGG(img.id_image)
                        FROM ps_product_attribute_image pai
                        JOIN ps_image img ON img.id_image = pai.id_image
                        WHERE pai.id_product_attribute = pa.id_product_attribute
                    )

                )
            )
            FROM ps_product_attribute pa
            JOIN ps_product_attribute_shop pas 
                ON pas.id_product_attribute = pa.id_product_attribute 
                AND pas.id_shop = p_id_shop
            LEFT JOIN ps_stock_available sa 
                ON sa.id_product = pa.id_product 
                AND sa.id_product_attribute = pa.id_product_attribute 
                AND sa.id_shop = p_id_shop
            WHERE pa.id_product = p.id_product
        )

    ) AS product_json

    FROM ps_product p

    LEFT JOIN ps_product_shop ps 
        ON ps.id_product = p.id_product AND ps.id_shop = p_id_shop

    LEFT JOIN ps_product_lang pl 
        ON pl.id_product = p.id_product 
        AND pl.id_lang = p_id_lang 
        AND pl.id_shop = p_id_shop

    LEFT JOIN ps_category_lang cl 
        ON cl.id_category = COALESCE(ps.id_category_default, p.id_category_default)
        AND cl.id_lang = p_id_lang 
        AND cl.id_shop = p_id_shop

    LEFT JOIN ps_manufacturer m 
        ON m.id_manufacturer = p.id_manufacturer

    LEFT JOIN ps_image i 
        ON i.id_product = p.id_product AND i.cover = 1

    LEFT JOIN ps_image_lang il 
        ON il.id_image = i.id_image AND il.id_lang = p_id_lang

    /* SPECIFIC PRICE */
    LEFT JOIN (
        SELECT sp1.*
        FROM ps_specific_price sp1
        WHERE sp1.id_product = p_id_product
          AND (sp1.id_customer = 0 OR sp1.id_customer = p_id_customer)
          AND (sp1.id_group = 0 OR sp1.id_group = p_id_group)
          AND (sp1.id_currency = 0 OR sp1.id_currency = p_id_currency)
          AND sp1.from_quantity <= p_quantity
        ORDER BY 
            sp1.id_customer DESC,
            sp1.id_group DESC,
            sp1.from_quantity DESC,
            sp1.id_specific_price DESC
        LIMIT 1
    ) sp ON sp.id_product = p.id_product

    WHERE p.id_product = p_id_product

    LIMIT 1;

END //

DELIMITER ;
-- +goose Down
