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


class RevisionMixin:
    __slots__ = ()
    revision = fields.Integer(
        "Revision", required=True, readonly=True,
        states={
            'invisible': Eval('revision', 0) == 0,
            })

    @classmethod
    def default_revision(cls):
        return 0

    @property
    def full_number(self):
        number = super().full_number
        if number is not None and self.revision:
            number += '/%d' % self.revision
        return number

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

    @classmethod
    @ModelView.button
    @Workflow.transition('draft')
    def draft(cls, records):
        cursor = Transaction().connection.cursor()
        table = cls.__table__()

        # Use SQL and before super to avoid two history entries
        cursor.execute(*table.update(
                [table.revision],
                [table.revision + 1],
                where=fields.SQL_OPERATORS['in'](
                    table.id, map(int, records))))

        super().draft(records)


class Sale(RevisionMixin, metaclass=PoolMeta):
    __name__ = 'sale.sale'
    _history = True


class Line(metaclass=PoolMeta):
    __name__ = 'sale.line'
    _history = True


class LineTax(metaclass=PoolMeta):
    __name__ = 'sale.line-account.tax'
    _history = True


class Subscription(RevisionMixin, metaclass=PoolMeta):
    __name__ = 'sale.subscription'
    _history = True


class SubscriptionLine(metaclass=PoolMeta):
    __name__ = 'sale.subscription.line'
    _history = True

# TODO: add rental
