import logging

from odoo import api, models
from odoo.exceptions import AccessError

_logger = logging.getLogger(__name__)


class ProductProduct(models.Model):
    _inherit = 'product.product'

    @api.model
    def _load_pos_data_fields(self, config_id):
        params = super()._load_pos_data_fields(config_id)
        params += ['all_product_tag_ids']

        # add missing product fields used in the reward_product_domain
        missing_fields = self.env['loyalty.reward']._get_reward_product_domain_fields(config_id) - set(params)

        if missing_fields:
            params.extend([field for field in missing_fields if field in self._fields])

        return params

    def _load_pos_data(self, data):
        res = super()._load_pos_data(data)
        config_id = self.env['pos.config'].browse(data['pos.config']['data'][0]['id'])
        try:
            rewards = config_id._get_program_ids().reward_ids
            reward_products = rewards.discount_line_product_id | rewards.reward_product_ids | rewards.reward_product_id
            trigger_products = config_id._get_program_ids().filtered(lambda p: p.program_type in ['ewallet', 'gift_card']).trigger_product_ids

            loyalty_product_ids = set(reward_products.ids + trigger_products.ids)
            classic_product_ids = {product['id'] for product in res['data']}
            products = self.env['product.product'].browse(list(loyalty_product_ids - classic_product_ids))
            products = products.read(fields=res['fields'], load=False)
            self._process_pos_ui_product_product(products, config_id)

            data['pos.session']['data'][0]['_pos_special_products_ids'] += [product.id for product in reward_products if product.id not in [p["id"] for p in res['data']]]
            res['data'].extend(products)
        except AccessError as e:
            _logger.warning('Cannot load loyalty products into the PoS \n%s', e)

        return res
