# This file is part of Tryton.  The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

from trytond.model import DeactivableMixin, ModelSQL, ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval, If


class Template(metaclass=PoolMeta):
    __name__ = 'product.template'

    web_shop_description = fields.Text("Web Shop Description", translate=True)


class Product(metaclass=PoolMeta):
    __name__ = 'product.product'

    web_shops = fields.Many2Many(
        'web.shop-product.product', 'product', 'shop', "Web Shops",
        states={
            'invisible': ~Eval('salable'),
            },
        domain=[
            If(~Eval('active'),
                ('id', '=', -1),
                ()),
            ],
        help="The list of web shops on which the product is published.")
    web_shop_urls = fields.One2Many(
        'product.web_shop_url', 'product', "Web Shop URLs", readonly=True)

    @fields.depends('active', 'web_shops')
    def on_change_active(self):
        try:
            super().on_change_active()
        except AttributeError:
            pass
        if not self.active and self.web_shops:
            self.web_shops = None

    @classmethod
    def copy(cls, products, default=None):
        default = default.copy() if default is not None else {}
        default.setdefault('web_shops')
        return super().copy(products, default=default)


class ProductURL(DeactivableMixin, ModelSQL, ModelView):
    __name__ = 'product.web_shop_url'

    shop = fields.Many2One('web.shop', "Shop", required=True)
    product = fields.Many2One('product.product', "Product", required=True)
    url = fields.Function(fields.Char(
            "Shop URL",
            states={
                'invisible': ~Eval('url'),
                }),
        'get_url')

    @classmethod
    def __setup__(cls):
        super().__setup__()
        cls.__access__.update(['shop', 'product'])

    @classmethod
    def table_query(cls):
        return Pool().get('web.shop-product.product').__table__()

    def get_url(self, name):
        return


class Category(metaclass=PoolMeta):
    __name__ = 'product.category'

    web_shops = fields.Many2Many(
        'web.shop-product.category', 'category', 'shop', "Web Shops",
        help="The list of web shops on which the category is published.")

    @classmethod
    def copy(cls, categories, default=None):
        default = default.copy() if default is not None else {}
        default.setdefault('web_shops')
        return super().copy(categories, default=default)


class Attribute(metaclass=PoolMeta):
    __name__ = 'product.attribute'

    web_shops = fields.Many2Many(
        'web.shop-product.attribute', 'attribute', 'shop', "Web Shops",
        help="The list of web shops on which the attribute is published.")

    @classmethod
    def copy(cls, attributes, default=None):
        default = default.copy() if default is not None else {}
        default.setdefault('web_shops')
        return super().copy(attributes, default=default)


class Image(metaclass=PoolMeta):
    __name__ = 'product.image'

    web_shop = fields.Boolean("Web Shop")

    @classmethod
    def default_web_shop(cls):
        return False

    @classmethod
    def allowed_match_keys(cls):
        return super().allowed_match_keys() | {'web_shop'}

    @classmethod
    def copy(cls, images, default=None):
        default = default.copy() if default is not None else {}
        default.setdefault('web_shop', False)
        return super().copy(images, default=default)
