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


@Component({
  selector: 'app-inserir-questionario',
  standalone: true,
  imports: [FormsModule, CommonModule, RouterModule],
  templateUrl: './inserir-questionario.component.html',
  styleUrls: ['./inserir-questionario.component.css']
})
export class InserirQuestionarioComponent implements OnInit {
  titulo: string = '';
  dataInicio: string = '';
  prazo: string = '';
  novaPergunta: string = '';
  novoTema: string ='';
  mostrarModal: boolean = false;
  modalTema: boolean = false;
  temasPergunta: TemaPergunta[] = [];
  tipoPergunta = TipoPergunta;
  opcoesTipoPergunta: { label: string, value: TipoPergunta }[] = [];
  tipoSelecionado = this.tipoPergunta.Aberta;

  perguntas: { id: number, texto: string; adicionar: boolean }[] = [];
  categoriaSelecionada: string = '';
  temaSelecionado: number | string = '';
  //tiposDePergunta: string[] = ['ABERTA', 'LIKERT','SIM/NÃO', 'MULTIPLA_ESCOLHA'];
  opcoesNovaPergunta: { textoOpcao: string, valor: number | null }[] = [];
  filtroTipo: string = '';
  filtroTema: string = '';
  todasPerguntas2: Pergunta[] = [];
  perguntasDisponiveis2: Pergunta[] = [];
  descricao: string = '';

  constructor(
    private questionarioService: QuestionarioService,
    private router: Router,
    private cdRef: ChangeDetectorRef,
    private authService: AuthService
  ) {}

  ngOnInit(): void {
    this.listarPerguntasDisponiveis();
    this.listarTemasPerguntas();
    this.carregarTiposPergunta();
  }

  private carregarTiposPergunta(): void {
    const valoresEnum = Object.values(TipoPergunta);
    this.opcoesTipoPergunta = valoresEnum.map(valor => ({
      value: valor,
      label: this.getLabelParaTipo(valor) 
    }));
  }

  private getLabelParaTipo(tipo: TipoPergunta): string {
    switch (tipo) {
      case TipoPergunta.MultiplaEscolha:
        return 'Múltipla Escolha';
      case TipoPergunta.Aberta:
        return 'Aberta';
      case TipoPergunta.Likert:
        return 'Escala Likert';
      case TipoPergunta.SimNao:
        return 'Sim/Não';
      default:
        return tipo;
    }
  }

  salvar() {
    const perguntasSelecionadas = this.perguntasDisponiveis2.filter(p => p.adicionar);

    const perguntasSelecionadasIds = perguntasSelecionadas.map(p => p.id).filter((id): id is number => id !== undefined);

    const descricao = this.descricao;

    this.authService.currentUser.subscribe((usuarioLogado: User | null) => {
      const questionario: Questionario = {
        titulo: this.titulo,
        descricao: descricao,
        dataPublicacao: new Date(this.dataInicio).toISOString().split('T')[0],
        dataValidade: new Date(this.prazo).toISOString().split('T')[0],
        perguntasId: perguntasSelecionadasIds,
        admId: usuarioLogado?.id ?? 0
      };

      this.questionarioService.inserirQuestionario(questionario).subscribe({
        next: () => this.router.navigate(['/questionario']),
        error: (erro) => console.error('Erro ao inserir questionário', erro)
      });
    });
  }

  adicionarPergunta() {
    const novaPerguntaParaSalvar = {
      texto: this.novaPergunta,
      idTema: this.temaSelecionado,
      tipo: this.tipoSelecionado,
      // Envia as opções apenas se o tipo for múltipla escolha
      opcoes: this.tipoSelecionado != 'ABERTA' ? this.opcoesNovaPergunta : []
    };
    this.questionarioService.cadastrarNovaPergunta(novaPerguntaParaSalvar).subscribe({
      next: (novaPerguntaCriada) => {
          novaPerguntaCriada.adicionar = true;
          this.todasPerguntas2 = [...this.todasPerguntas2, novaPerguntaCriada];
          this.perguntasDisponiveis2 = [...this.todasPerguntas2];
          this.perguntas.push(novaPerguntaCriada);
   
          this.novaPergunta = '';
          this.tipoSelecionado = this.tipoPergunta.Aberta;
          this.temaSelecionado = '';
          this.opcoesNovaPergunta = [];
          this.mostrarModal = false;
          this.cdRef.detectChanges();
        },
        error: (erro) => console.error('Erro ao cadastrar nova pergunta', erro)
    });    
  }

  /*
  trackByPerguntaId(index: number, item: any): number {
    return item.id;
  }
  */
 
  get isNovaPerguntaInvalida(): boolean{
    if(!this.novaPergunta.trim()){
      return true;
    }
    if(this.tipoSelecionado != 'ABERTA'){
      if(this.opcoesNovaPergunta.length < 2){
        return true;
      }
      const temOpcaoInvalida = this.opcoesNovaPergunta.some(opcao =>{
        return !opcao.textoOpcao.trim() || opcao.valor === null;
      });
      if(temOpcaoInvalida){
        return true;
      }
    }
    return false;
  }
          

  adicionarOpcao(): void {
      this.opcoesNovaPergunta.push({ textoOpcao: '', valor: null });
  }

  removerOpcao(index: number): void {
      this.opcoesNovaPergunta.splice(index, 1);
  }

   listarTemasPerguntas(){
    this.questionarioService.listarTemas().subscribe({
      next: (data: TemaPergunta[])=>{ 
        this.temasPergunta = data;
      },
       error: (erro) => {
        console.error('Erro ao carregar questionários', erro);
      }
    });
  }

  listarPerguntasDisponiveis() {
    this.questionarioService.listarPerguntas().subscribe({
      next: (data : Pergunta[]) => {
        this.todasPerguntas2 = data
        this.perguntasDisponiveis2 = [...this.todasPerguntas2]; // exibe todas inicialmente
      },
      error: (erro) =>{
        console.error('Erro ao listar perguntas', erro);
      } 
    });
  }

  adicionarPerguntaExistente(perguntaData: { id: number, texto: string }) {
    this.perguntas.push({ ...perguntaData, adicionar: true });
  }

  isFormularioInvalido(): boolean {
    return !this.titulo || !this.prazo || !this.perguntasDisponiveis2.some(p => p.adicionar);
  }

  get isNovoTemaInvalido(): boolean{
    if(this.novoTema.trim() ===''){
      return true;
    }
    return false
  }

  adicionarTema(){
    this.questionarioService.adicionaTema(this.novoTema).subscribe({
      next: () => {
        this.listarTemasPerguntas();
        this.novoTema = '';
        this.modalTema = false;
      },
      error: (err) => {
      console.error('Falha ao adicionar o tema:', err);
      alert('Não foi possível adicionar o tema. Por favor, tente novamente.');
      }
    });
    
  }

  filtrarPerguntasPorTema() {
    if (!this.filtroTema) {
      this.perguntasDisponiveis2 = [...this.todasPerguntas2];
    } else {
      this.perguntasDisponiveis2 = this.todasPerguntas2.filter(
        p => p.idTema === +this.filtroTema
      );
    }
  }

  filtrarPerguntasPorTipo() {
    if (!this.filtroTipo) {
      this.perguntasDisponiveis2 = [...this.todasPerguntas2];
    } else {
      this.perguntasDisponiveis2 = this.todasPerguntas2.filter(
        p => p.tipo === this.filtroTipo
      );
    }
  }

  onTipoPerguntaChange(): void {
    switch (this.tipoSelecionado) {
      
      case 'LIKERT':
        this.opcoesNovaPergunta = [
          { textoOpcao: 'Totalmente Insatisfeito', valor: 1 },
          { textoOpcao: 'Insatisfeito', valor: 2 },
          { textoOpcao: 'Neutro', valor: 3 },
          { textoOpcao: 'Satisfeito', valor: 4 },
          { textoOpcao: 'Totalmente Satisfeito', valor: 5 }
        ];
        break;

      case 'SIM/NÃO':
        this.opcoesNovaPergunta = [
          { textoOpcao: 'Não', valor: 0 },
          { textoOpcao: 'Sim', valor: 1 }
        ];
        break;

      case 'MULTIPLA_ESCOLHA':
        this.opcoesNovaPergunta = [
          { textoOpcao: '', valor: 1 },
          { textoOpcao: '', valor: 2 },
          { textoOpcao: '', valor: 3 }
        ];
        break;

      default:
        this.opcoesNovaPergunta = [];
        break;
    }
  }

}