import { Component, Inject, OnInit } from '@angular/core';
import { CommonModule, DecimalPipe } from '@angular/common';
import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Vehicle } from './vehicle.interface';
import jsPDF from 'jspdf';
import 'jspdf-autotable';

interface SimulationRow {
  parcela: number;
  prazoTotal: number;
  vencimento: Date;
  saldoDevedor: number;
  principal: number;
  juros: number;
  saldoPosAmortizacao: number;
  pagamento: number;
}

@Component({
  selector: 'app-finance-simulator',
  standalone: true,
  imports: [CommonModule, ReactiveFormsModule],
  providers: [DecimalPipe],
  template: `
    <div class="simulator-container">
      <div class="simulator-header">
        <h2>Simulação de Financiamento - Pré-Fixado</h2>
        <div class="vehicle-info">
          <p>Veículo: {{vehicle.brand}} {{vehicle.model}}</p>
          <p>Placa: {{vehicle.license_plate}}</p>
        </div>
      </div>

      <form [formGroup]="simulatorForm" (ngSubmit)="calculateSimulation()">
        <div class="parameters-section">
          <!-- <h4>Parâmetros da Operação</h4> -->
          <div class="form-grid">
            <div class="form-column">
              <div class="custom-field">
                <select formControlName="tipoCalculo" id="tipoCalculo">
                  <option *ngFor="let tipo of tiposCalculo" [value]="tipo.value">
                    {{tipo.label}}
                  </option>
                </select>
                <label for="tipoCalculo">Tipo de Cálculo</label>
              </div>

              <div class="custom-field">
                <input
                  formControlName="valorSolicitado"
                  type="number"
                  step="0.01"
                  id="valorSolicitado"
                  placeholder=" ">
                <label for="valorSolicitado">Valor Solicitado</label>
              </div>

              <div class="custom-field">
                <input
                  formControlName="taxaJuros"
                  type="number"
                  id="taxaJuros"
                  step="0.01"
                  placeholder=" ">
                <label for="taxaJuros">Taxa de Juros (%)</label>
              </div>
            </div>

            <div class="form-column">
              <div class="custom-field">
                <input
                  formControlName="custoEmissao"
                  type="text"
                  id="custoEmissao"
                  placeholder=" "
                  [ngModel]="simulatorForm.get('custoEmissao')?.value | number:'1.2-2'"
                  readonly>
                <label for="custoEmissao">Custo de Emissão</label>
              </div>

              <div class="custom-field">
                <input
                  formControlName="quantidadeParcelas"
                  type="number"
                  id="quantidadeParcelas"
                  placeholder=" ">
                <label for="quantidadeParcelas">Quantidade de Parcelas</label>
              </div>
            </div>

            <div class="form-column">
              <div class="custom-field">
                <input
                  formControlName="dataEmissao"
                  type="date"
                  id="dataEmissao"
                  placeholder=" ">
                <label for="dataEmissao">Data de Emissão</label>
              </div>

              <div class="custom-field">
                <input
                  formControlName="primeiroVencimento"
                  type="date"
                  id="primeiroVencimento"
                  placeholder=" ">
                <label for="primeiroVencimento">Data do 1º Vencimento</label>
              </div>
            </div>
          </div>

          <div class="readonly-info">
            <div class="info-grid">
              <div class="info-field">
                <label>Modalidade</label>
                <span>Pré-Fixado</span>
              </div>
              <div class="info-field">
                <label>Valor do Contrato</label>
                <span>{{valorContrato | currency:'BRL'}}</span>
              </div>
              <div class="info-field">
                <label>Valor Líquido</label>
                <span>{{valorLiquido | currency:'BRL'}}</span>
              </div>
              <div class="info-field">
                <label>Taxa A.M.</label>
                <span>{{simulatorForm.get('taxaJuros')?.value || 0}}%</span>
              </div>
              <div class="info-field">
                <label>Taxa A.A.</label>
                <span>{{taxaAA | number:'1.2-2'}}%</span>
              </div>
              <div class="info-field">
                <label>CET A.M.</label>
                <span>{{cetAM | number:'1.2-2'}}%</span>
              </div>
              <div class="info-field">
                <label>CET A.A.</label>
                <span>{{cetAA | number:'1.2-2'}}%</span>
              </div>
              <div class="info-field">
                <label>Prazo (anos)</label>
                <span>{{prazoAnos | number:'1.2-2'}}</span>
              </div>
              <div class="info-field">
                <label>IOF Total</label>
                <span>{{iofTotal | currency:'BRL'}}</span>
              </div>
            </div>
          </div>

          <button type="submit" class="simulate-button">Simular</button>
        </div>
      </form>

      <div class="results-section" *ngIf="simulationResults.length > 0">
        <div class="actions-bar">
          <h3>Resultados da Simulação</h3>
          <button  (click)="exportPDF()">
            <i class="fas fa-file-pdf"></i>
            Exportar PDF
          </button>
        </div>
        <div class="table-container">
          <table>
            <thead>
              <tr>
                <th>Parcela</th>
                <th>Prazo Total</th>
                <th>Vencimento</th>
                <th>Saldo Devedor</th>
                <th>Principal</th>
                <th>Juros</th>
                <th>Saldo Pós Amortização</th>
                <th>Pagamento</th>
              </tr>
            </thead>
            <tbody>
              <tr *ngFor="let row of simulationResults">
                <td>{{row.parcela}}</td>
                <td>{{row.prazoTotal}}</td>
                <td>{{row.vencimento | date:'dd/MM/yyyy'}}</td>
                <td>{{row.saldoDevedor | number:'1.2-2'}}</td>
                <td>{{row.principal | number:'1.2-2'}}</td>
                <td>{{row.juros | number:'1.2-2'}}</td>
                <td>{{row.saldoPosAmortizacao | number:'1.2-2'}}</td>
                <td>{{row.pagamento | number:'1.2-2'}}</td>
              </tr>
            </tbody>
            <tfoot>
              <tr>
                <td colspan="7" class="total-label">Total:</td>
                <td class="total-value">{{getTotalPagamentos() | currency:'BRL'}}</td>
              </tr>
            </tfoot>
          </table>
        </div>
      </div>
    </div>
  `,
  styles: [`
    .simulator-container {
      padding: 1.5rem;
      background: var(--surface);
      border-radius: 8px;
      height: 100%;
      display: flex;
      flex-direction: column;
      overflow: hidden;
    }

    .simulator-header {
      margin-bottom: 1rem;
    }

    .vehicle-info {
      margin-top: 1rem;
      color: var(--text-secondary);
    }

    .parameters-section {
      margin-bottom: 1rem;
    }

    .form-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 1.5rem;
      margin-bottom: 1rem;
    }

    .form-column {
      display: flex;
      flex-direction: column;
      gap: 1rem;
    }

    .custom-field {
      position: relative;
      width: 100%;
    }

    .custom-field input {
      width: 100%;
      padding: 8px 12px;
      font-size: 14px;
      border: 1px solid var(--divider);
      border-radius: 4px;
      background: var(--surface);
      color: var(--text-primary);
      transition: all 0.2s;
    }

    .custom-field label {
      position: absolute;
      left: 8px;
      top: 50%;
      transform: translateY(-50%);
      background-color: var(--surface);
      padding: 0 4px;
      color: var(--text-secondary);
      font-size: 14px;
      transition: all 0.2s;
      pointer-events: none;
    }

    .custom-field input:focus,
    .custom-field input:not(:placeholder-shown) {
      border-color: var(--primary);
      outline: none;
    }

    .custom-field input:focus + label,
    .custom-field input:not(:placeholder-shown) + label {
      top: 0;
      font-size: 12px;
      color: var(--primary);
    }

    .custom-field select {
      width: 100%;
      padding: 8px 12px;
      font-size: 14px;
      border: 1px solid var(--divider);
      border-radius: 4px;
      background: var(--surface);
      color: var(--text-primary);
      transition: all 0.2s;
      height: 36px;
      cursor: pointer;
    }

    .custom-field select:focus {
      border-color: var(--primary);
      outline: none;
    }

    .custom-field select + label {
      position: absolute;
      left: 8px;
      top: 50%;
      transform: translateY(-50%);
      background-color: var(--surface);
      padding: 0 4px;
      color: var(--text-secondary);
      font-size: 14px;
      transition: all 0.2s;
      pointer-events: none;
    }

    .custom-field select:focus + label,
    .custom-field select:not([value=""]) + label {
      top: 0;
      font-size: 12px;
      color: var(--primary);
    }

    .simulate-button {
      background: var(--primary);
      color: white;
      border: none;
      padding: 0.75rem 1.5rem;
      border-radius: 4px;
      cursor: pointer;
      font-weight: 500;
      transition: background-color 0.2s;
    }

    .results-section {
      flex: 1;
      overflow: hidden;
      display: flex;
      flex-direction: column;
    }

    .table-container {
      flex: 1;
      overflow: auto;
      margin-top: 0.5rem;
    }

    table {
      width: 100%;
      border-collapse: collapse;
    }

    th, td {
      padding: 0.75rem;
      text-align: left;
      border-bottom: 1px solid var(--divider);
    }

    th {
      background-color: var(--surface-variant-subtle);
      font-weight: 500;
    }

    tfoot {
      border-top: 2px solid var(--divider);
      font-weight: bold;
    }

    .total-label {
      text-align: right;
      padding-right: 1rem;
    }

    .total-value {
      color: var(--primary);
    }

    tfoot tr {
      background-color: var(--surface-variant-subtle);
    }

    .readonly-info {
      margin: 1rem 0;
      padding: 1rem;
      background: var(--surface-variant-subtle);
      border-radius: 4px;
    }

    .info-grid {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 1rem;
      padding: 0.5rem;
    }

    .info-field {
      display: flex;
      flex-direction: column;
      gap: 0.25rem;
    }

    .info-field label {
      font-size: 0.875rem;
      color: var(--text-secondary);
    }

    .info-field span {
      font-size: 1rem;
      font-weight: 500;
      color: var(--text-primary);
    }

    @media (max-width: 1024px) {
      .form-grid {
        grid-template-columns: repeat(2, 1fr);
      }
      
      .info-grid {
        grid-template-columns: repeat(2, 1fr);
      }
    }

    @media (max-width: 768px) {
      .form-grid {
        grid-template-columns: 1fr;
      }
      
      .info-grid {
        grid-template-columns: repeat(2, 1fr);
      }
    }

    @media (max-width: 480px) {
      .info-grid {
        grid-template-columns: 1fr;
      }
    }

    .actions-bar {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 1rem;
    }

    .print-button {
      display: flex;
      align-items: center;
      gap: 0.5rem;
      padding: 0.5rem 1rem;
      background: var(--primary);
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      transition: background-color 0.2s;
    }

    .print-button:hover {
      background: var(--primary-dark);
    }

    .print-button i {
      font-size: 1.1rem;
    }
  `]
})
export class FinanceSimulatorComponent implements OnInit {
  simulatorForm: FormGroup;
  simulationResults: SimulationRow[] = [];
  vehicle: Vehicle;

  taxaAA: number = 0;
  cetAM: number = 0;
  cetAA: number = 0;
  prazoAnos: number = 0;
  iofTotal: number = 0;
  valorContrato: number = 0;
  valorLiquido: number = 0;
  modalidade: string = 'Pré-Fixado';

  tiposCalculo = [
    { value: 'liquido', label: 'Valor Líquido' },
    { value: 'bruto', label: 'Valor Bruto' }
  ];

  constructor(
    private fb: FormBuilder,
    private dialogRef: MatDialogRef<FinanceSimulatorComponent>,
    @Inject(MAT_DIALOG_DATA) data: { vehicle: Vehicle },
    private decimalPipe: DecimalPipe
  ) {
    this.vehicle = data.vehicle;
    const valorSolicitado = parseFloat(this.vehicle.price?.toString() || '0');
    
    this.simulatorForm = this.fb.group({
      valorSolicitado: [valorSolicitado, Validators.required],
      taxaJuros: [2.2, Validators.required],
      custoEmissao: [{ 
        value: this.calcularCustoEmissao(valorSolicitado), 
        disabled: true 
      }, Validators.required],
      quantidadeParcelas: [48, Validators.required],
      dataEmissao: [new Date().toISOString().split('T')[0], Validators.required],
      primeiroVencimento: ['', Validators.required],
      tipoCalculo: ['liquido', Validators.required]
    });

    // Atualiza custo de emissão quando valor solicitado mudar
    this.simulatorForm.get('valorSolicitado')?.valueChanges.subscribe(valor => {
      this.simulatorForm.patchValue({
        custoEmissao: this.calcularCustoEmissao(valor)
      }, { emitEvent: false });
    });
  }

  formatCurrency(value: number): string {
    return new Intl.NumberFormat('pt-BR', {
      style: 'currency',
      currency: 'BRL'
    }).format(value);
  }

  private calcularCustoEmissao(valor: number): number {
    // Calcula o valor numérico
    const custoEmissao = valor >= 100000 ? valor * 0.01 : valor * 0.02;
    
    // Atualiza o form com o valor formatado para exibição
    if (this.simulatorForm) {
      const valorFormatado = this.decimalPipe.transform(custoEmissao, '1.2-2');
      this.simulatorForm.get('custoEmissao')?.patchValue(custoEmissao, { emitEvent: false });
    }
    
    // Retorna o valor numérico para os cálculos
    return custoEmissao;
  }

  ngOnInit() {
    // Define primeiro vencimento como padrão para 30 dias após emissão
    const date = new Date();
    date.setDate(date.getDate() + 30);
    this.simulatorForm.patchValue({
      primeiroVencimento: date.toISOString().split('T')[0]
    });
  }

  calculateSimulation() {
    if (this.simulatorForm.valid) {
      const values = {
        ...this.simulatorForm.value,
        // Garantir que estamos usando o valor numérico
        custoEmissao: parseFloat(this.simulatorForm.get('custoEmissao')?.value) || 0
      };

      const valorBase = values.valorSolicitado;
      const custoEmissao = values.custoEmissao;
      let saldoDevedor: number;

      // Ajusta valores baseado no tipo de cálculo
      if (values.tipoCalculo === 'liquido') {
        this.valorLiquido = valorBase;
        this.valorContrato = valorBase + custoEmissao + this.iofTotal;
        // Valor a ser financiado é o valor contrato
        saldoDevedor = this.valorContrato;
      } else {
        this.valorContrato = valorBase;
        this.valorLiquido = valorBase - custoEmissao - this.iofTotal;
        // Valor a ser financiado é o valor solicitado
        saldoDevedor = valorBase;
      }

      const taxaMensal = values.taxaJuros / 100;
      const taxaDiaria = taxaMensal * (12/365);

      // Calcula taxa anual
      this.taxaAA = (Math.pow(1 + taxaMensal, 12) - 1) * 100;

      // Calcula prazo em anos
      this.prazoAnos = values.quantidadeParcelas / 12;

      // Ajusta as datas para manter o dia correto
      const dataEmissao = new Date(values.dataEmissao + 'T00:00:00');
      const dataPrimeiroVencimento = new Date(values.primeiroVencimento + 'T00:00:00');
      
      const diasPrimeiraParcela = Math.floor(
        (dataPrimeiroVencimento.getTime() - dataEmissao.getTime()) 
        / (1000 * 60 * 60 * 24)
      );

      // Calcula CET
      const custoEmissaoPercentual = (values.custoEmissao / values.valorSolicitado) * 100;
      const custoEmissaoMensal = custoEmissaoPercentual / values.quantidadeParcelas;
      const jurosPeriodoInicialPercentual = (taxaDiaria * diasPrimeiraParcela * 100);
      const jurosPeriodoInicialMensal = jurosPeriodoInicialPercentual / values.quantidadeParcelas;

      // Soma todos os componentes do CET
      this.cetAM = (taxaMensal * 100) + custoEmissaoMensal + jurosPeriodoInicialMensal;
      this.cetAA = (Math.pow(1 + this.cetAM/100, 12) - 1) * 100;

      this.iofTotal = 0;

      let diasAcumulados = 0;

      // Adiciona linha zero (momento da liberação)
      const parcelas: SimulationRow[] = [];
      parcelas.push({
        parcela: 0,
        prazoTotal: 0,
        vencimento: new Date(values.dataEmissao),
        saldoDevedor: saldoDevedor,
        principal: 0,
        juros: 0,
        saldoPosAmortizacao: saldoDevedor,
        pagamento: 0
      });

      // Calcula dias do período inicial e juros
      const jurosPeriodoInicial = saldoDevedor * taxaDiaria * diasPrimeiraParcela;
      saldoDevedor += jurosPeriodoInicial;

      // Calcula valor da parcela (sistema Price) com o novo saldo devedor
      const valorParcela = (saldoDevedor * taxaMensal * Math.pow(1 + taxaMensal, values.quantidadeParcelas)) 
        / (Math.pow(1 + taxaMensal, values.quantidadeParcelas) - 1);

      for (let i = 1; i <= values.quantidadeParcelas; i++) {
        const dataVencimentoAtual = new Date(values.primeiroVencimento + 'T00:00:00');
        dataVencimentoAtual.setMonth(dataVencimentoAtual.getMonth() + (i - 1));
        
        if (i === 1) {
          diasAcumulados = diasPrimeiraParcela;
        } else {
          const dataVencimentoAnterior = new Date(parcelas[i-1].vencimento);
          const diasEntreParcelas = Math.floor(
            (dataVencimentoAtual.getTime() - dataVencimentoAnterior.getTime()) 
            / (1000 * 60 * 60 * 24)
          );
          diasAcumulados += diasEntreParcelas;
        }

        const juros = saldoDevedor * taxaMensal;
        const amortizacao = valorParcela - juros;
        const saldoPosAmortizacao = saldoDevedor - amortizacao;

        parcelas.push({
          parcela: i,
          prazoTotal: diasAcumulados,
          vencimento: dataVencimentoAtual,
          saldoDevedor: saldoDevedor,
          principal: amortizacao,
          juros: juros,
          saldoPosAmortizacao: saldoPosAmortizacao,
          pagamento: valorParcela
        });

        saldoDevedor = saldoPosAmortizacao;
      }

      this.simulationResults = parcelas;
    }
  }

  getTotalPagamentos(): number {
    return this.simulationResults.reduce((total, row) => total + row.pagamento, 0);
  }

  close() {
    this.dialogRef.close();
  }

  exportPDF() {
    const doc = new jsPDF();
    
    // Cabeçalho
    doc.setFontSize(16);
    doc.text('Simulação de Financiamento - Pré-Fixado', 14, 20);
    
    // Informações do veículo
    doc.setFontSize(12);
    doc.text(`Veículo: ${this.vehicle.brand} ${this.vehicle.model}`, 14, 30);
    doc.text(`Placa: ${this.vehicle.license_plate}`, 14, 37);

    // Parâmetros da operação
    doc.text('Parâmetros da Operação', 14, 47);
    const params = [
      ['Valor do Contrato', this.formatCurrency(this.valorContrato)],
      ['Valor Líquido', this.formatCurrency(this.valorLiquido)],
      ['Taxa A.M.', `${this.simulatorForm.get('taxaJuros')?.value}%`],
      ['Taxa A.A.', `${this.taxaAA.toFixed(2)}%`],
      ['CET A.M.', `${this.cetAM.toFixed(2)}%`],
      ['CET A.A.', `${this.cetAA.toFixed(2)}%`],
      ['Prazo (anos)', this.prazoAnos.toFixed(2)],      
      ['IOF Total', this.formatCurrency(this.iofTotal)]
    ];

    (doc as any).autoTable({
      startY: 50,
      head: [['Parâmetro', 'Valor']],
      body: params,
      theme: 'grid',
      headStyles: { fillColor: [66, 66, 66] }
    });

    // Tabela de parcelas
    const tableData = this.simulationResults.map(row => [
      row.parcela,
      row.prazoTotal,
      new Date(row.vencimento).toLocaleDateString(),
      this.formatCurrency(row.saldoDevedor),
      this.formatCurrency(row.principal),
      this.formatCurrency(row.juros),
      this.formatCurrency(row.saldoPosAmortizacao),
      this.formatCurrency(row.pagamento)
    ]);

    (doc as any).autoTable({
      startY: (doc as any).lastAutoTable.finalY + 10,
      head: [['Parcela', 'Prazo', 'Vencimento', 'Saldo Devedor', 'Principal', 'Juros', 'Saldo Pós', 'Pagamento']],
      body: tableData,
      theme: 'grid',
      headStyles: { fillColor: [66, 66, 66] },
      styles: { fontSize: 8 }
    });

    // Salva o PDF usando a placa do veículo no nome do arquivo
    const fileName = `simulacao-financiamento-${this.vehicle.license_plate.toLowerCase()}.pdf`;
    doc.save(fileName);
  }
} 