# 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 fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction


class CreateChartProperties(metaclass=PoolMeta):
    __name__ = 'account.create_chart.properties'

    category_account_expense = fields.Many2One(
        'account.account', 'Default Expense Account',
        domain=[
            ('closed', '!=', True),
            ('type.expense', '=', True),
            ('company', '=', Eval('company', -1)),
            ])
    category_account_revenue = fields.Many2One(
        'account.account', 'Default Revenue Account',
        domain=[
            ('closed', '!=', True),
            ('type.revenue', '=', True),
            ('company', '=', Eval('company', -1)),
            ])


class CreateChart(metaclass=PoolMeta):
    __name__ = 'account.create_chart'

    def transition_create_properties(self):
        pool = Pool()
        Configuration = pool.get('account.configuration')
        state = super().transition_create_properties()

        with Transaction().set_context(company=self.properties.company.id):
            config = Configuration(1)
            for name in [
                    'category_account_expense',
                    'category_account_revenue']:
                setattr(config, 'default_%s' % name,
                    getattr(self.properties, name, None))
            config.save()
        return state

    def default_properties(self, fields):
        pool = Pool()
        Account = pool.get('account.account')

        defaults = super().default_properties(fields)
        expense_accounts = Account.search([
                ('type.expense', '=', True),
                ('company', '=', self.account.company.id),
                ], limit=2)
        revenue_accounts = Account.search([
                ('type.revenue', '=', True),
                ('company', '=', self.account.company.id),
                ], limit=2)
        if len(expense_accounts) == 1:
            defaults['category_account_expense'] = expense_accounts[0].id
        else:
            defaults['category_account_expense'] = None
        if len(revenue_accounts) == 1:
            defaults['category_account_revenue'] = revenue_accounts[0].id
        else:
            defaults['category_account_revenue'] = None
        return defaults


class MoveLine(metaclass=PoolMeta):
    __name__ = 'account.move.line'

    @property
    def product(self):
        pass

    @property
    def rule_pattern(self):
        def parents(categories):
            for category in categories:
                while category:
                    yield category
                    category = category.parent

        pattern = super().rule_pattern
        if self.product:
            pattern['product'] = self.product.id
            pattern['product_categories'] = [
                c.id for c in parents(self.product.categories_all)]
        else:
            pattern['product'] = None
            pattern['product_categories'] = []
        return pattern
