#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 decimal import Decimal
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Eval


class Move(ModelSQL, ModelView):
    _name = 'stock.move'
    anglo_saxon_quantity = fields.Float('Anglo-Saxon Quantity',
            digits=(16, Eval('unit_digits', 2)))

    def __init__(self):
        super(Move, self).__init__()
        self._sql_constraints += [
            ('check_anglo_saxon_quantity',
                'CHECK(quantity >= anglo_saxon_quantity)',
                'Anglo-Saxon quantity can not be greater than quantity!'),
        ]

    def default_anglo_saxon_quantity(self):
        return 0.0

    def _get_anglo_saxon_move(self, moves, quantity):
        '''
        Generator of (move, qty) where move is the move to be consumed and qty
        is the quantity (in the product default uom) to be consumed on this
        move.
        '''
        uom_obj = self.pool.get('product.uom')

        consumed_qty = 0.0
        for move in moves:
            qty = uom_obj.compute_qty(move.uom,
                    move.quantity - move.anglo_saxon_quantity,
                    move.product.default_uom, round=False)
            if qty <= 0.0:
                continue
            if qty > quantity - consumed_qty:
                qty = quantity - consumed_qty
            if consumed_qty >= quantity:
                break
            yield (move, qty)

    def update_anglo_saxon_quantity_product_cost(self, product, moves,
            quantity, uom, type_):
        '''
        Return the cost for quantity based on lines.
        Update anglo_saxon_quantity on the concerned moves.
        '''
        uom_obj = self.pool.get('product.uom')

        for move in moves:
            assert move.product == product, 'wrong product'
        assert type_.startswith('in_') or type_.startswith('out_'), 'wrong type'

        total_qty = uom_obj.compute_qty(uom, quantity, product.default_uom,
                round=False)

        cost = Decimal('0.0')
        consumed_qty = 0.0
        for move, move_qty in self._get_anglo_saxon_move(moves, total_qty):
            consumed_qty += move_qty

            if type_.startswith('in_'):
                move_cost_price = uom_obj.compute_price(move.uom,
                        move.unit_price, move.product.default_uom)
            else:
                move_cost_price = move.cost_price
            cost += move_cost_price * Decimal(str(move_qty))

            self.write(move.id, {
                'anglo_saxon_quantity': ((move.anglo_saxon_quantity or 0.0)
                    + move_qty),
                })

        if consumed_qty < total_qty:
            qty = total_qty - consumed_qty
            consumed_qty += qty
            cost += product.cost_price * Decimal(str(qty))
        return cost

Move()
