/* Copyright 2025 FSFLA
   Alexandre Oliva <lxoliva@fsfla.org>

   Este arquivo é parte do IRPF-Livre.

   IRPF-Livre é Software Livre; você pode redistribuir e/ou modificar
   a maior parte dele, inclusive este arquivo, de acordo com os termos
   da GNU Lesser General Public License publicada pela Free Software
   Foundation; tanto a versão 2.1 dessa licença, quanto (à sua
   escolha) qualquer versão posterior.

   Alguns componentes podem ser distribuídos e/ou modificados de
   acordo com outras licenças, incluídas no executável e consolidadas
   no arquivo list/licenses nos fontes.

   IRPF-Livre é distribuído na esperança de que ele seja útil, mas SEM
   QUALQUER GARANTIA; até mesmo sem qualquer garantia implícita de
   COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte
   a GNU Lesser General Public License para mais detalhes.

   Você deve ter recebido uma cópia da GNU Lesser General Public
   License junto com IRPF-Livre; se não, escreva para a Free Software
   Foundation, Inc., no endereço 59 Temple Street, Suite 330, Boston,
   MA 02111-1307 USA.

   Veja uma tradução não oficial da licença em
   http://creativecommons.org/licenses/LGPL/2.1/legalcode.pt


   This file is part of IRPF-Livre.

   IRPF-Livre is free software; you can redistribute and/or modify
   most of it, this file included, under the terms of the GNU Lesser
   General Public License as published by the Free Software
   Foundation; either version 2.1 of the License, or (at your option)
   any later version.

   Some components can be distributed and/or modified under different
   licenses, included in the executable and consolidated in the file
   list/licenses in the source tree.

   IRPF-Livre is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with IRPF-Livre; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA.
*/

package serpro.ppgd.irpf.gcap.alienacao;
import serpro.ppgd.irpf.gcap.consolidacao.Consolidacao;
import serpro.ppgd.irpf.tabelas.CadastroTabelasIRPF;
import serpro.ppgd.negocio.Alfa;
import serpro.ppgd.negocio.CPF;
import serpro.ppgd.negocio.Codigo;
import serpro.ppgd.negocio.Data;
import serpro.ppgd.negocio.Logico;
import serpro.ppgd.negocio.Inteiro;
import serpro.ppgd.negocio.ObjetoNegocio;
import serpro.ppgd.negocio.Valor;

public class AlienacaoItem extends ObjetoNegocio
{
  private CalculoImposto calculoImposto = new CalculoImposto ();
  private Ajuste ajuste = new Ajuste ();
  private Consolidacao consolidacao = new Consolidacao ();

  private Logico alienacaoAPrazo = new Logico (this, "");
  private Logico alienacaoAnoAnterior = new Logico (this, "");
  private Logico alienacaoParcial = new Logico (this, "");
  private Logico bemGrandeValor = new Logico (this, "");
  private Alfa bemGrandeValorOperacao = new Alfa (this, "");
  private Alfa codigoOperacao = new Alfa (this, "");
  private Valor corretagemAnosAnteriores = new Valor (this, "");
  private CPF cpf = new CPF (this, "");
  private Valor custoCorretagem = new Valor (this, "");
  private Data dataAlienacao = new Data (this, "");
  private Data dataFimPermanencia = new Data (this, "");
  private Data dataInicioPermanencia = new Data (this, "");
  private Data dataRecebimentoUltimaParcela = new Data (this, "");
  private Data dataTransitoJulgado = new Data (this, "");
  private Data dataVencimentoTCM = new Data (this, "");
  private Valor ganhoCapitalAlienacaoAnterior = new Valor (this, "");
  private Logico inCobranca = new Logico (this, "");
  private Logico motivoTransmissaoCausaMortisDecisaoJudicial = new Logico (this, "");
  private Valor natureza = new Valor (this, "", 2, 0);
  private Alfa nomePaisDeclarante = new Alfa (this, "");
  private Alfa numeroItem = new Alfa (this, "");
  private Codigo paisAcordo = new Codigo (this, "", CadastroTabelasIRPF.recuperarPaises ());
  private Codigo paisResidencia = new Codigo (this, "", CadastroTabelasIRPF.recuperarPaises ());
  private Logico recebimentoUltimaParcelaAnoAnterior = new Logico (this, "");
  private Logico residenteBrasil = new Logico (this, "");
  private Logico temUltimaParcela = new Logico (this, "");
  private Logico territorioParaisoFiscal = new Logico (this, "");
  private Valor valorAlienacao = new Valor (this, "");
  private Valor valorLiquidoRecebidoAnosAnteriores = new Valor (this, "");
  private Valor valorRecebidoAnosAnteriores = new Valor (this, "");

  public AlienacaoItem ()
  {
    alienacaoAPrazo.converteEmTipoSimNao (Logico.NAO);
    alienacaoParcial.converteEmTipoSimNao (Logico.NAO);
    inCobranca.converteEmTipoSimNao (Logico.NAO);
    motivoTransmissaoCausaMortisDecisaoJudicial.converteEmTipoSimNao (Logico.NAO);
    residenteBrasil.converteEmTipoSimNao (Logico.NAO);
    temUltimaParcela.converteEmTipoSimNao (Logico.NAO);
  }

  public CalculoImposto getCalculoImposto ()
  {
    return calculoImposto;
  }

  public Ajuste getAjuste ()
  {
    return ajuste;
  }

  public Consolidacao getConsolidacao ()
  {
    return consolidacao;
  }

  public Logico getAlienacaoAPrazo ()
  {
    return alienacaoAPrazo;
  }

  public Logico getAlienacaoAnoAnterior ()
  {
    return alienacaoAnoAnterior;
  }

  public Logico getAlienacaoParcial ()
  {
    return alienacaoParcial;
  }

  public Logico getBemGrandeValor ()
  {
    return bemGrandeValor;
  }

  public Alfa getBemGrandeValorOperacao ()
  {
    return bemGrandeValorOperacao;
  }

  public Alfa getCodigoOperacao ()
  {
    return codigoOperacao;
  }

  public Valor getCorretagemAnosAnteriores ()
  {
    return corretagemAnosAnteriores;
  }

  public CPF getCpf ()
  {
    return cpf;
  }

  public Valor getCustoCorretagem ()
  {
    return custoCorretagem;
  }

  public Data getDataAlienacao ()
  {
    return dataAlienacao;
  }

  public Data getDataFimPermanencia ()
  {
    return dataFimPermanencia;
  }

  public Data getDataInicioPermanencia ()
  {
    return dataInicioPermanencia;
  }

  public Data getDataRecebimentoUltimaParcela ()
  {
    return dataRecebimentoUltimaParcela;
  }

  public Data getDataTransitoJulgado ()
  {
    return dataTransitoJulgado;
  }

  public Data getDataVencimentoTCM ()
  {
    return dataVencimentoTCM;
  }

  public Valor getGanhoCapitalAlienacaoAnterior ()
  {
    return ganhoCapitalAlienacaoAnterior;
  }

  public Logico getInCobranca ()
  {
    return inCobranca;
  }

  public Logico getMotivoTransmissaoCausaMortisDecisaoJudicial ()
  {
    return motivoTransmissaoCausaMortisDecisaoJudicial;
  }

  public Valor getNatureza ()
  {
    return natureza;
  }

  public Alfa getNomePaisDeclarante ()
  {
    return nomePaisDeclarante;
  }

  public Alfa getNumeroItem ()
  {
    return numeroItem;
  }

  public Codigo getPaisAcordo ()
  {
    return paisAcordo;
  }

  public Codigo getPaisResidencia ()
  {
    return paisResidencia;
  }

  public Logico getRecebimentoUltimaParcelaAnoAnterior ()
  {
    return recebimentoUltimaParcelaAnoAnterior;
  }

  public Logico getResidenteBrasil ()
  {
    return residenteBrasil;
  }

  public Logico getTemUltimaParcela ()
  {
    return temUltimaParcela;
  }

  public Logico getTerritorioParaisoFiscal ()
  {
    return territorioParaisoFiscal;
  }

  public Valor getValorAlienacao ()
  {
    return valorAlienacao;
  }

  public Valor getValorLiquidoRecebidoAnosAnteriores ()
  {
    return valorLiquidoRecebidoAnosAnteriores;
  }

  public Valor getValorRecebidoAnosAnteriores ()
  {
    return valorRecebidoAnosAnteriores;
  }

  public static final int NaturezaPRT = 2;
  public static final int NaturezaTCM = 12;
  public int getNaturezaAsInteger () {
    return (int)natureza.getParteInteiraAsLong ().longValue ();
  }

  private static final String[] natureza2string = new String[] {
    "",
    "Venda",
    "Permuta com Recebimento de Torna",
    "Desapropriação",
    "Dação em Pagamento",
    "Outras Doações",
    "Procuração em Causa Própria",
    "Promessa de Compra e Venda",
    "Cessão de Direitos/Créditos",
    "Liquidação ou Resgate de Aplicação Financeira",
    "Outros",
    "Dissolução da Sociedade Conjugal ou União Estável",
    "Transmissão Causa Mortis",
    "Doação em Adiantamento da Legítima",
    "Alienações, resgates e outras transferências",
    "Alienação de Ações em Bolsa de Valores",
    "Alienação de Ações em Balcão",
    "Crédito de Juros de Aplicação Financeira",
    "Depósitos em conta corrente, cartão de crédito ou débito",
  };
  public String Natureza () {
    int nat = getNaturezaAsInteger ();
    if (nat >= 0 && nat < natureza2string.length)
      return natureza2string[nat];
    return "";
  }

}
