import { Component, OnInit } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { ActivatedRoute, RouterModule, Router } from '@angular/router';
import { Questionario } from '../../../models/questionario.model';
import { QuestionarioService } from '../../../services/questionario.service';
import { AuthService, User } from '../../../services/auth.service';

@Component({
  selector: 'app-responderQuestionario',
  standalone: true,
  imports: [
    FormsModule,
    CommonModule,
    RouterModule
  ],
  templateUrl: './responderQuestionario.component.html',
  styleUrls: ['./responderQuestionario.component.css']
})

export class ResponderQuestionarioComponent implements OnInit {

  questionario!: Questionario;
  respostas: { perguntaId: number, opcaoId: number | null, texto: String | null }[] = [];
  //respostas: { [perguntaId: number]: any } = {};
  usuario!: User;

  constructor(
    private route: ActivatedRoute,
    private questionarioService: QuestionarioService,
    private router: Router,
    private authService: AuthService
  ) { }

  ngOnInit(): void {
    const id = Number(this.route.snapshot.queryParamMap.get('id'));
    if (id) {
      this.carregarQuestionario(id);
    } else {
      alert('ID do questionário não encontrado!');
      this.router.navigate(['/']);
    }
    this.authService.currentUser.subscribe(user => {
      this.usuario = user!;
    });
  }

  carregarQuestionario(id: number) {
    this.questionarioService.buscarPorId(id).subscribe({
      next: (data: Questionario) => {
        this.questionario = data;
        this.respostas = [];
        if (this.questionario.perguntas) {
          this.questionario.perguntas.forEach(p => {
            if (p.id !== undefined) {
              if (p.tipo !== 'MULTIPLA_ESCOLHA'){
                this.respostas.push({ perguntaId: p.id, opcaoId: null, texto: null });
              }
            }
          });
        }
      },
      error: err => {
        console.error('Erro ao carregar questionário', err);
        alert('Erro ao carregar questionário.');
      }
    });
  }

  selecionarResposta(perguntaId: number, opcaoId: number): void {
    const index = this.respostas.findIndex(r => r.perguntaId === perguntaId);
    if (index !== -1) {
      this.respostas[index].opcaoId = opcaoId;
      this.respostas[index].texto = null;
    } else {
      this.respostas.push({ perguntaId, opcaoId, texto: null });
    }
  }

  selecionarMultiplaEscolha(perguntaId: number, opcaoId: number, event: Event) {
    const isChecked = (event.target as HTMLInputElement).checked;
    if (isChecked) {
      this.respostas.push({ perguntaId, opcaoId, texto: null });
    } else {
      const index = this.respostas.findIndex(r => r.perguntaId === perguntaId && r.opcaoId === opcaoId);
      if (index !== -1) {
        this.respostas.splice(index, 1);
      }
    }
  }

  atualizarRespostaAberta(perguntaId: number, event: Event) {
    const texto = (event.target as HTMLTextAreaElement).value;
    const index = this.respostas.findIndex(r => r.perguntaId === perguntaId);

    if (index !== -1) {
      this.respostas[index].texto = texto;
    } else {
      this.respostas.push({ perguntaId, opcaoId: null, texto: texto });
    }
  }

  isOpcaoSelecionada(perguntaId: number, opcaoId: number): boolean {
    return this.respostas.some(r => r.perguntaId === perguntaId && r.opcaoId === opcaoId);
  }

  getRespostaAberta(perguntaId: number): String | null {
    const resposta = this.respostas.find(r => r.perguntaId === perguntaId);
    return resposta ? resposta.texto : '';
  }

  formInvalido(): boolean {
    if (!this.questionario || !this.questionario.perguntas) {
      return true;
    }
    const respostasPreenchidas = this.respostas.filter(r => r.opcaoId !== null || (r.texto !== null && r.texto !== '')).length;
    return respostasPreenchidas < this.questionario.perguntas.length;
  }

  enviarRespostas() {
    const respostasParaEnviar = this.respostas;

    this.questionarioService.enviarRespostas(this.questionario.id!, this.usuario.id, respostasParaEnviar).subscribe({
      next: () => {
        alert('Respostas enviadas com sucesso!');
        this.router.navigate(['/listar']);
      },
      error: err => {
        console.error('Erro ao enviar respostas', err);
        alert('Erro ao enviar respostas');
      }
    });
  }

  cancelar(){
    this.router.navigate(['/listar']);
  }
}
