# -*- coding: utf-8 -*-
from openerp import models, fields, tools, api
import openerp.addons.decimal_precision as dp

class cashbox_statement_confirm(models.Model):
    _name = "cashbox.statement.confirm"
    # _inherit = "cashbox.statement.confirm"

    name = fields.Char('name', required=True)
    ref = fields.Char('Ref')
    date = fields.Date()
    active = fields.Boolean('Active', default=True)
    message_confirm = fields.Text('Message Confirm')
    message_deleted = fields.Text('Message Deleted')
    ### Statement confirm - open
    statement_id = fields.Many2one('account.bank.statement', 'Bank Statement Confirm')
    statement_open = fields.Many2one('account.bank.statement', 'Bank Statement Open')
    ## User statement - User Confirm
    user_statement = fields.Many2one('res.users', 'Res user')
    user_confirm = fields.Many2one('res.users', 'Res user')
    ## Journal
    journal_id = fields.Many2one('account.journal', 'Journal')
    ## Line
    line_difference = fields.Many2one('account.bank.statement.line', 'Bank statement line difference')
    line_next_open = fields.Many2one('account.bank.statement.line', 'Bank statement line next open statement')
    line_open = fields.Many2one('account.bank.statement.line', 'Bank statement line open')
    ### Amount
    amount_statement = fields.Float('Amount Statement', digits_compute=dp.get_precision('Account'), required=True)
    amount_real = fields.Float('Amount Real', digits_compute=dp.get_precision('Account'), required=True)
    amount_difference = fields.Float('Amount Difference', digits_compute=dp.get_precision('Account'), required=True)
    amount_next_open =  fields.Float('Amount Next open statement', digits_compute=dp.get_precision('Account'), required=True)
    ## estado del regsitro
    state_avaliable = fields.Boolean('Avaliable', default=True, help="True : disponible, False : Utilizado")
    # casbox_transfer_id =fields.Many2one('cash.box.transfer', 'cashBox transfer')
    cashbox_transfer_ids =fields.One2many('cash.box.transfer', 'cashbox_confirm_id', string="transfer id")

    '''
        @fields statement_id        = Id de la caja que se esta cerrando.
        @fields user_statement      = Id del propietario de la caja.
        @fields journal_id          = Id del diario de la caja.
        @fields line_difference     = Id de la linea de la caja donde se registro la diferencia del cierre.
        @fields line_next_open      = Id de la linea donde se registro el monto de próxima apertura de caja.
        @fields amount_statement    = Monto en la caja del sistema.
        @fields amount_real         = Monto real del cierre de la caja.
        @fields amount_difference   = Monto de la diferencia del cierre.
        @fields amount_next_open    = Monto de la próxima apertura de caja.
        @fields user_confirm        = Usuario que cerro la caja
        @fields statement_open      = Id de la caja que utilize el saldo disponible para proxima apertura
        @fields state_avaliable     = 'True': disponible, 'False': Utilizado
        @fields cashbox_transfer_ids= id transferencia
    '''

    '''
          ____       _       _      ____             __ _
         |  _ \ _ __(_)_ __ | |_   / ___|___  _ __  / _(_)_ __ _ __ ___
         | |_) | '__| | '_ \| __| | |   / _ \| '_ \| |_| | '__| '_ ` _ \
         |  __/| |  | | | | | |_  | |__| (_) | | | |  _| | |  | | | | | |
         |_|   |_|  |_|_| |_|\__|  \____\___/|_| |_|_| |_|_|  |_| |_| |_| v 1.0
    '''
    @api.model
    def get_cashbox_statement_confirm(self, statementId):
        return[{
            'id': casBox.id,
            'name': casBox.name,
            'statement': {
                'id': casBox.statement_id.id,
                'name': casBox.statement_id.name,
                'dateOpen': casBox.statement_id.date,
                'dateConfirm': casBox.statement_id.closing_date,
                'typeStatementID': casBox.statement_id.type_statement.id,
                'typeStatementName': casBox.statement_id.type_statement.name,
                'userId': casBox.statement_id.user_id.id,
                'userName': casBox.statement_id.user_id.name,
                'currencystatement': {
                    'id': casBox.statement_id.currency.id,
                    'name': casBox.statement_id.currency.name,
                    'symbol': casBox.statement_id.currency.symbol,
                    'rate': casBox.statement_id.currency.rate,
                    'thousandsSeparator': casBox.statement_id.currency.thousands_separator,
                    'decimalSeparator': casBox.statement_id.currency.decimal_separator,
                    'decimalPlaces': casBox.statement_id.currency.decimal_places,
                    'position': casBox.statement_id.currency.position,
                },
            },
            'userStatementName': casBox.user_statement.name,
            'userStatementLogin': casBox.user_statement.login,
            'userConfirmName': casBox.user_confirm.name,
            'userConfirmLogin': casBox.user_confirm.login,
            'amountStatement': casBox.amount_statement,
            'amountReal': casBox.amount_real,
            'amountDifference': casBox.amount_difference,
            'amountNextOpen': casBox.amount_next_open,
            'transferCasBox': [{
                'id': confirm.id,
                'name': confirm.name,
                'amount': confirm.amount
            } for confirm in self.env['cash.box.transfer'].search([('cashbox_confirm_id.id', '=', casBox.id)])],
        } for casBox in self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statementId), ('active', '=', True)])]


'''
    Transfer
'''
class cash_box_transfer(models.Model):
    _inherit = "cash.box.transfer"

    cashbox_confirm_id = fields.Many2one('cashbox.statement.confirm', string='cashBox Confirm', ondelete='cascade', index=True)


'''    ____          _     _                  ____             __ _
      / ___|__ _ ___| |__ | |__   _____  __  / ___|___  _ __  / _(_)_ __ _ __ ___
     | |   / _` / __| '_ \| '_ \ / _ \ \/ / | |   / _ \| '_ \| |_| | '__| '_ ` _ \
     | |__| (_| \__ \ | | | |_) | (_) >  <  | |__| (_) | | | |  _| | |  | | | | | |
      \____\__,_|___/_| |_|_.__/ \___/_/\_\  \____\___/|_| |_|_| |_|_|  |_| |_| |_| v 2.0
'''
class AccountBankStatementConfirm(models.Model):
    _inherit = 'account.bank.statement'

    '''
        GET CASHBOX GENERAL.
    '''
    @api.model
    def get_account_bank_statement_general(self, id):
        bankStatement = self._get_statement_transfer(id)
        return [{
            'id': statement.id,
            'journalId': statement.journal_id.id,
            'date': statement.date,
            'typeStatementId': statement.type_statement.id,
            'typeStatementName': statement.type_statement.name,
            'userId': statement.user_id.id,
            'userName': statement.user_id.name,
            'name': statement.name,
            'state': statement.state,
            'statementname': statement.name+" / "+statement.user_id.name
        } for statement in self.env['account.bank.statement'].search([('state', '=', 'open'), ('id', '!=', bankStatement.id), ('type_statement.code', '=', 'GENERAL'), ('journal_id.id', '=', bankStatement.journal_id.id)])]


    '''
        Confirm Statement
    '''
    @api.model
    def account_bank_statement_confirm(self, values):
        ## Date Server
        date_server = self.get_server_datetime()
        ## User
        user = self.env.user
        ## Statement
        bankStatement = self._get_statement_transfer(values['statementId'])
        if (not bankStatement):
            return {
                'state': False,
                'message': "Error en obtener la caja base."
            }

        casboxConfirm = self._get_casbox_confirm(bankStatement.id)

        amountStatement = 0.0
        for line in bankStatement.line_ids:
            amountStatement += line.amount
        if (bankStatement.balance_start > 0):
            amountStatement += bankStatement.balance_start

        amountReal = 0  if (values['amountReal'] < 0) else values['amountReal']

        ## Diference
        lineBalance = []
        if (amountStatement != amountReal):
            name = "Ajuste de cierre de caja "
            lineBalance = self._create_statement_line_confirm(bankStatement, name, (amountReal - amountStatement),values['refBalance'])

        ## TRANSFERENCIA
        cash_box_transfer = []
        if (values['transfer']):
            statementTransfer = self._get_statement_transfer(values['statementTransfer'])
            if (not statementTransfer):
                return {
                    'state': False,
                    'message': "Error al obtener la caja general."
                }

            name = "TRANSFERENCIA/"+str(statementTransfer.name)
            lineTransfer = self._create_statement_line_transfer(bankStatement, name, (-values['amountTransfer']), values['refTransfer'])
            if (not lineTransfer):
                return {
                    'state': False,
                    'message': "Error al registrar la transferencia."
                }

            name = "TRANSFERENCIA/"+str(bankStatement.name)
            lineGeneralTransfer = self._create_statement_line_transfer(statementTransfer, name, (values['amountTransfer']), values['refTransfer'])
            if (not lineGeneralTransfer):
                return {
                    'state': False,
                    'message': "Error al registrar la transferencia."
                }

            cash_box_transfer = self._create_cash_box_transfer(values['refTransfer'], abs(values['amountTransfer']), lineGeneralTransfer, lineTransfer)
            if (not cash_box_transfer):
                return {
                    'state': False,
                    'message': "Error al registrar la transferencia."
                }

        amountNextOpen = 0.0
        for line in bankStatement.line_ids:
            amountNextOpen += line.amount
        if (bankStatement.balance_start > 0):
            amountNextOpen += bankStatement.balance_start

        lineNextOpen = []
        if (amountNextOpen > 0):
            name ="Saldo para próxima apertura de caja."
            ref = "Cierre"
            lineNextOpen = self._create_statement_line_transfer(bankStatement, name, -amountNextOpen, ref)

        ## chasbox Confirm
        cashboxConfirm = {
            'name': "CIERRE DE CAJA /"+str(bankStatement.name),
            'date': date_server,
            'ref': values['refBalance'],
            'statement_id': bankStatement.id,
            'user_statement': bankStatement.user_id.id,
            'user_confirm': user.id,
            'journal_id' : bankStatement.journal_id.id,
            'amount_statement': amountStatement,
            'amount_real': values['amountReal'],
            'line_difference': lineBalance.id if (lineBalance) else '',
            'amount_difference': lineBalance.amount if (lineBalance) else 0.0,
            'line_next_open': lineNextOpen.id if(lineNextOpen) else '',
            'amount_next_open': abs(lineNextOpen.amount) if(lineNextOpen) else 0.0,
            'state_avaliable': True if(lineNextOpen and lineNextOpen.amount > 0) else False,
        }


        statementConfirm = self._create_cashbox_statement_confirm(cashboxConfirm, bankStatement)
        if (not statementConfirm):
            return {
                'state': False,
                'message': "Error en el cierre de caja ."
            }

        if (cash_box_transfer):
            cash_box_transfer.write({'cashbox_confirm_id': statementConfirm.id })


        confirm = bankStatement.button_confirm_cash()
        if (not confirm):
            return {
                'state': False,
                'message': "Error en el cierre de caja ."
            }

        return {
            'state': True,
                'message': "Operación realizada con suceso."
        }


    '''
        Get Cashbox statement Confirm
    '''
    def _get_casbox_confirm(self,statementId):
        return self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statementId)])

    '''
        Create Line statement.
    '''
    def _create_statement_line_confirm(self, statement, name, amount, ref):
        statementLine = {
            'statement_id': statement.id,
            'name': name,
            'amount': amount,
            'ref': ref,
            'account_id': statement.journal_id.internal_account_id.id,
            'journal_id': statement.journal_id.id,
            'is_deleted': True
        }

        return self.env['account.bank.statement.line'].create(statementLine)


    '''
        Create cashbox Confirm
    '''
    def _create_cashbox_statement_confirm(self,values, statement):
        casbox = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
        if (not casbox):
            confirm = self.env['cashbox.statement.confirm'].create(values)
        else:
            confirm = casbox.write(values)
            if (confirm):
                confirm = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])

        return confirm