# -*- codind: utf-8 -*-
from functools import partial
from datetime import date


from PyQt5.QtCore import QDate, Qt, QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView


from Views.aReceber import Ui_ct_AReceber
from Views.formAReceber import Ui_ct_FormReceber


from Crud.CrudContaAReceber import CrudContaAReceber
from Crud.CrudCatAReceber import CrudCatAReceber
from Crud.CrudStatusPagamento import CrudStatusPagamento

from Funcoes.extenso import retorno


class MainAReceber(Ui_ct_AReceber, Ui_ct_FormReceber):
    def mainAReceber(self, frame):
        super(MainAReceber, self).setAReceber(frame)
        self.fr_AReceber.show()

        """ Chamanda de funções localizadas no arquivo financeiro.py na pasta Funcoes """
        # Icone dos botoes
        self.setIconFinanceiro()

        # Setando Data Padrão
        self.setDataFinanceiro()

        # Tamanho da Tabela
        self.tamanhoTabelaFinanceiro(self.fr_AReceber)
        """ Fim das chamandas """

        # Chamando funcao popular checkBox
        self.listaStatus()

        # Chamando funcao Popular tabela a receber
        self.tabelaAReceber()

        # Funcao chamada botoes
        # Buscar
        self.bt_Busca.clicked.connect(self.tabelaAReceber)

        # Imprimir
        self.bt_Print.clicked.connect(self.imprimirAReceber)

        # Abrindo form cadastrar
        self.bt_AddConta.clicked.connect(self.formAReceber)

    # Populando check Box
    def listaStatus(self):
        busca = CrudStatusPagamento()
        busca.listaStatusPagamento()
        self.cb_Situacao.clear()

        i = 0
        for lista in busca.statusPagamento:
            self.cb_Situacao.addItem(
                busca.statusPagamento[i].upper(), str(busca.id[i]))
            i += 1

        self.cb_Situacao.setCurrentIndex(
            self.cb_Situacao.findData(2))

    # Populando tabela de contas a receber
    def tabelaAReceber(self):
        busca = CrudContaAReceber()
        dataInicio = QDate.toString(
            self.dt_Inicio.date(), "yyyy-MM-dd")
        dataFim = QDate.toString(
            self.dt_Fim.date(), "yyyy-MM-dd")
        busca.dataVencimento = dataInicio
        busca.dataFim = dataFim
        busca.statusPagamento = self.cb_Situacao.currentData()
        busca.listaContaAReceber()
        while self.tb_AReceber.rowCount() > 0:
            self.tb_AReceber.removeRow(0)

        self.totalRecebido = 0.00
        self.totalPendente = 0.00

        i = 0
        for lista in busca.nomeCliente:
            self.tb_AReceber.insertRow(i)
            self.conteudoTabela(self.tb_AReceber, i, 0, str(busca.id[i]))
            self.TabelaStatus(self.tb_AReceber, i, 1,
                              self.StatusEntrega(1,
                                                 busca.idStatusPagamento[i]))
            self.TabelaNomeTelefone(self.tb_AReceber, i, 2, busca.nomeCliente[i],
                                    busca.telefoneCliente[i])
            self.TabelaNomeTelefone(
                self.tb_AReceber, i, 3, busca.descricao[i], "")

            self.TabelaEntrega(self.tb_AReceber, i, 4,
                               busca.dataVencimento[i],
                               self.StatusEntrega(busca.idStatusPagamento[i]),
                               busca.statusPagamento[i].upper())
            self.conteudoTabela(self.tb_AReceber, i, 5,
                                "R$ "+str(busca.valor[i]))

            self.conteudoTabela(self.tb_AReceber, i, 6,
                                "R$ "+str(busca.valor[i] - busca.valorRecebido[i]))
            self.botaoReceberParcela(
                self.tb_AReceber, i, 7, partial(
                    self.BuscaContaAReceber, busca.id[i]),
                "Receber",  2)

            # Total Pendente
            self.totalPendente = self.totalPendente + \
                float((busca.valor[i] - busca.valorRecebido[i]))
            # Total Recebido
            self.totalRecebido = self.totalRecebido + \
                float(busca.valorRecebido[i])

            i += 1

    # Cadastro e Edição conta a receber
    def formAReceber(self):
        self.LimpaFrame(self.fr_AReceber)
        super(MainAReceber, self).setFormAReceber(self.fr_AReceber)
        self.fr_FormReceber.show()

        # Checado ID
        self.idCheckAReceber()

        """ Chamanda de funções localizadas no arquivo financeiro.py na pasta Funcoes """
        # Autocomplete
        self.setAutocompleteFinanceiro()

        # Data Vencimento e Pagamento com data Atual
        self.setDataVencPgto()

        # Setando Icones Salvar, Voltar e Imprimir
        self.setIconFormFinanceiro()

        # Pupulando combobox Repetir
        self.cboxRepedir(self.cb_repetir)

        # Botao Add Categoria
        self.bt_AddCategoriaProduto.clicked.connect(
            self.AddCategoriaFinanceiro)

        # Botao Cancela add Categoria
        self.bt_CancelAddCatergoria.clicked.connect(
            partial(self.CalcelAddFinanceiro, self.bt_CancelAddCatergoria,
                    self.bt_AddCategoriaProduto, self.tx_addCategoria,
                    self.cb_categoria))

        # Validador Campos Float
        self.ValidaInputFloat(self.tx_valor)
        self.ValidaInputFloat(self.tx_valorPago)

        # valida Campo Int
        self.ValidaInputInt(self.tx_Id)

        """ Fim Chamanda financeiro.py  """

        """ Chamanda de funções localizadas no arquivo FormaPagamento.py na pasta Funcoes """
        # Autocomplete
        self.CboxFPagamento(self.cb_formaPagamento)
        """ Fim Chamanda FormaPagamento.py  """

        """ Chamanda de funções localizadas no arquivo categoriaAReceber.py na pasta Funcoes """
        # Populando combobox Forma de Pagamento
        self.cboxCatAReceber(self.cb_categoria)
        """ Fim Chamanda categoriaAPagar.py  """

        """ Chamanda de funções localizadas no arquivo clientes.py na pasta Funcoes """
        # Campo Busca por nome e Autocompletar Cliente
        self.tx_NomeFantasia.textEdited.connect(self.autocompleCliente)
        self.tx_NomeFantasia.returnPressed.connect(
            partial(self.BuscaClienteNome, self.tx_descricao))

        # Return Press Busca Id Cliente
        self.tx_Id.returnPressed.connect(
            partial(self.BuscaClienteId, self.tx_descricao))

        """ Fim Chamadas """
        # Adicionando Nova Categoria
        self.tx_addCategoria.returnPressed.connect(self.CadCategoriraReceber)

        # Foco campos ID Cliente
        self.tx_Id.setFocus()

        # Botao Receber
        self.bt_receber.clicked.connect(self.ReceberParcela)

        # Imprimir Recibo
        self.bt_PrintRecibo.clicked.connect(self.imprimirReciboRec)

        # Botao Salvar
        self.bt_Salvar.clicked.connect(self.validaCadReceber)

        # Botao Voltar
        self.bt_Voltar.clicked.connect(self.JanelaAReceber)
        pass

    # checando campo Id se é Edicao ou Nova Venda
    def idCheckAReceber(self):
        if not self.tx_Cod.text():
            busca = CrudContaAReceber()
            self.tx_Cod.setText(str(busca.lastIdContaAReceber()))
        pass

    # Buscando Conta a Receber através de ID recebido da Tabela
    def BuscaContaAReceber(self, id):
        self.formAReceber()
        busca = CrudContaAReceber()
        busca.id = id
        busca.selectContaID()
        self.tx_Cod.setText(str(busca.id))
        self.tx_Id.setText(str(busca.idCliente))
        self.BuscaClienteId(self.tx_descricao)
        self.tx_descricao.setText(busca.descricao)
        self.cb_categoria.setCurrentIndex(
            self.cb_categoria.findData(busca.categoria))
        self.dt_Vencimento.setDate(busca.dataVencimento)
        self.tx_valor.setText(str(busca.valor))
        self.tx_Obs.setPlainText(busca.obs)
        if busca.dataRecebimento:
            self.dt_dataPagamento.setDate(busca.dataRecebimento)
        self.cb_formaPagamento.setCurrentIndex(
            self.cb_formaPagamento.findData(busca.idFormaPagamento))
        self.tx_valorPago.setText(str(busca.valor - busca.valorRecebido))
        self.lb_ValorPendente.setText(str(busca.valor - busca.valorRecebido))

        if busca.idStatusPagamento == 1:
            self.bt_receber.setDisabled(True)
            self.bt_PrintRecibo.setVisible(True)
            self.desabilitaLineEdit(self.fr_FormReceber)

        elif busca.idStatusPagamento == 2:
            self.bt_receber.setEnabled(True)

        self.cb_repetir.setHidden(True)
        self.lb_Repetir.setHidden(True)
        self.lb_obsRepetir.setHidden(True)
        pass

    # Recebendo pagamento DB
    def ReceberParcela(self, id):

        if not self.tx_valorPago.text():
            self.tx_valorPago.setFocus()
        elif not self.cb_formaPagamento.currentData():
            self.cb_formaPagamento.setFocus()
        else:
            INSERI = CrudContaAReceber()
            INSERI.id = self.tx_Cod.text()
            INSERI.valorRecebido = self.tx_valorPago.text().replace(",", ".")
            INSERI.formaPagamento = self.cb_formaPagamento.currentData()
            INSERI.dataRecebimento = QDate.toString(
                QDate.currentDate(), "yyyy-MM-dd")
            INSERI.receberConta()
            self.BuscaContaAReceber(self.tx_Cod.text())
        pass

    def validaCadReceber(self):
        if not self.tx_Id.text():
            self.tx_Id.setFocus()
        elif not self.tx_descricao.text():
            self.tx_descricao.setFocus()
        elif not self.tx_valor.text():
            self.tx_valor.setFocus()
        else:
            self.cadContaReceber()

    # Cadastro contaa Receber
    def cadContaReceber(self):
        repetir = int(self.cb_repetir.currentData())
        for i in range(repetir):
            id = int(self.tx_Cod.text()) + i
            INSERI = CrudContaAReceber()
            INSERI.id = id
            INSERI.idCliente = self.tx_Id.text()
            INSERI.descricao = self.tx_descricao.text()
            INSERI.categoria = self.cb_categoria.currentData()
            INSERI.formaPagamento = self.cb_formaPagamento.currentData()
            INSERI.dataVencimento = QDate.toString(QDate.addMonths(
                self.dt_Vencimento.date(), i), "yyyy-MM-dd")
            INSERI.valor = self.tx_valor.text()
            INSERI.obs = self.tx_Obs.toPlainText()
            INSERI.inseriContaAReceber()
        self.BuscaContaAReceber(self.tx_Cod.text())

    # Cadastro Categoria a Receber
    def CadCategoriraReceber(self):
        INSERI = CrudCatAReceber()
        id = INSERI.lastIdCatAReceber()
        categoria = self.tx_addCategoria.text().upper()
        INSERI.id = id
        INSERI.categoriaReceber = categoria
        INSERI.inseriCatAReceber()
        self.cb_categoria.addItem(categoria, str(id))
        self.cb_categoria.setCurrentIndex(self.cb_categoria.findData(str(id)))
        self.CalcelAddFinanceiro(self.bt_CancelAddCatergoria,
                                 self.bt_AddCategoriaProduto, self.tx_addCategoria,
                                 self.cb_categoria)

    # Imprimindo
    def imprimirAReceber(self):
        self.documento = QWebEngineView()

        headertable = ["Cliente", "Descrição ",
                       "Vencimento", "Valor", "V. Pendente"]

        data_inicio = QDate.toString(self.dt_Inicio.date(), "dd-MM-yyyy")
        data_fim = QDate.toString(self.dt_Fim.date(), "dd-MM-yyyy")

        if self.cb_Situacao.currentData() == '1':
            situacao = "Recebida"

        elif self.cb_Situacao.currentData() == '2':
            situacao = "Pendente"

        cliente = []
        descricao = []
        vencimento = []
        valor = []
        pendente = []
        for i in range(self.tb_AReceber.rowCount()):
            cliente.append(self.tb_AReceber.cellWidget(i, 2).text())
            descricao.append(self.tb_AReceber.cellWidget(i, 3).text())
            vencimento.append(self.tb_AReceber.cellWidget(i, 4).text())
            valor.append(self.tb_AReceber.item(i, 5).text())
            pendente.append(self.tb_AReceber.item(i, 6).text())

        self.renderTemplate(
            "areceber.html",
            estilo=self.resourcepath('Template/estilo.css'),
            titulo="Relatório de conta a receber {} de {} à {}".format(
                situacao, data_inicio, data_fim),
            headertable=headertable,
            nome=cliente,
            desc=descricao,
            venc=vencimento,
            valor=valor,
            pendente=pendente,
            totalPen=format(self.totalPendente, '.2f'),
            totalRec=format(self.totalRecebido, '.2f')


        )

        self.documento.load(QUrl.fromLocalFile(
                                 self.resourcepath("report.html")))
        self.documento.loadFinished['bool'].connect(self.previaImpressao)

    # Imprimindo

    def imprimirReciboRec(self):

        self.documento = QWebEngineView()

        self.renderTemplate(
            "recibo.html",
            estilo=self.resourcepath('Template/estilo.css'),
            cod=self.tx_Cod.text(),
            nome=self.tx_NomeFantasia.text(),
            descricao=self.tx_descricao.text(),
            valor=self.tx_valor.text().replace('.', ','),
            valor_ext=retorno(self.tx_valor.text()),
            data=date.today().strftime("%d-%m-%Y")

        )

        self.documento.load(QUrl.fromLocalFile(
                                 self.resourcepath("report.html")))
        self.documento.loadFinished['bool'].connect(self.previaImpressao)
