import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatTableModule } from '@angular/material/table';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatDialog, MatDialogModule } from '@angular/material/dialog';
import { MatSlideToggleModule, MatSlideToggleChange } from '@angular/material/slide-toggle'; // Importa anche MatSlideToggleChange
import { FormsModule } from '@angular/forms'; // Necessario per ngModel in mat-slide-toggle
import { TeacherService, Teacher, TeacherInput } from '../../services/teacher.service'; // Importa servizio e interfacce
import { ConfirmDialogComponent, ConfirmDialogData } from '../confirm-dialog/confirm-dialog.component';
import { TeacherDialogComponent } from '../teacher-dialog/teacher-dialog.component'; // Importa il dialog insegnanti
// import { TeacherDialogComponent } from '../teacher-dialog/teacher-dialog.component';
import { Observable } from 'rxjs';

@Component({
  selector: 'app-teachers',
  standalone: true,
  imports: [
    CommonModule,
    FormsModule, // Aggiungi FormsModule
    MatTableModule,
    MatButtonModule,
    MatIconModule,
    MatProgressSpinnerModule,
    MatDialogModule,
    MatSlideToggleModule // Aggiungi MatSlideToggleModule
  ],
  templateUrl: './teachers.component.html',
  styleUrl: './teachers.component.scss'
})
export class TeachersComponent implements OnInit {

  teachers$: Observable<Teacher[]> | undefined;
  // Colonne per la tabella insegnanti (adattate)
  displayedColumns: string[] = ['id', 'last_name', 'first_name', 'email', 'phone', 'is_active', 'actions'];
  isLoading = false;
  error: string | null = null;

  constructor(
    private teacherService: TeacherService,
    private dialog: MatDialog
  ) { }

  ngOnInit(): void {
    this.loadTeachers();
  }

  loadTeachers(): void {
    this.isLoading = true;
    this.error = null;
    this.teachers$ = this.teacherService.getTeachers();

    this.teachers$.subscribe({
      next: () => this.isLoading = false,
      error: (err) => {
        console.error('Error loading teachers:', err);
        this.error = 'Errore durante il caricamento degli insegnanti.';
        this.isLoading = false;
      }
    });
  }

  addTeacher(): void {
    const dialogRef = this.dialog.open(TeacherDialogComponent, {
      width: '600px', // Larghezza maggiore per più campi
      data: {} // Dati vuoti per la modalità aggiunta
    });
    dialogRef.afterClosed().subscribe(result => {
      if (result) {
        this.isLoading = true;
        this.teacherService.addTeacher(result).subscribe({
          next: () => this.loadTeachers(),
          error: (err) => {
            console.error('Error adding teacher:', err);
            this.error = 'Errore durante l\'aggiunta dell\'insegnante.';
            this.isLoading = false;
          }
        });
      }
    });
  }

  editTeacher(teacher: Teacher): void {
    // Recupera i dati completi dell'insegnante prima di aprire il dialog
    // perché la tabella potrebbe mostrare solo dati parziali
    this.teacherService.getTeacher(teacher.id).subscribe({
        next: (fullTeacherData) => {
            const dialogRef = this.dialog.open(TeacherDialogComponent, {
              width: '600px',
              data: { teacher: fullTeacherData } // Passa i dati completi
            });
            dialogRef.afterClosed().subscribe(result => {
              if (result) {
                this.isLoading = true;
                this.teacherService.updateTeacher(teacher.id, result).subscribe({
                  next: () => this.loadTeachers(),
                  error: (err) => {
                    console.error(`Error updating teacher ${teacher.id}:`, err);
                    this.error = 'Errore durante la modifica dell\'insegnante.';
                    this.isLoading = false;
                  }
                });
              }
            });
        },
        error: (err) => {
             console.error(`Error fetching full teacher data for ID ${teacher.id}:`, err);
             this.error = 'Errore nel recuperare i dati completi per la modifica.';
        }
    });
  }

  deleteTeacher(teacher: Teacher): void {
    const dialogData: ConfirmDialogData = {
      title: 'Conferma Eliminazione Insegnante',
      message: `Sei sicuro di voler eliminare l'insegnante "${teacher.first_name} ${teacher.last_name}" (ID: ${teacher.id})?`,
      confirmButtonText: 'Elimina'
    };

    const dialogRef = this.dialog.open(ConfirmDialogComponent, {
      width: '400px',
      data: dialogData
    });

    dialogRef.afterClosed().subscribe(confirmed => {
      if (confirmed) {
        this.isLoading = true;
        this.teacherService.deleteTeacher(teacher.id).subscribe({
          next: () => this.loadTeachers(),
          error: (err) => {
            console.error(`Error deleting teacher ${teacher.id}:`, err);
            this.error = 'Errore durante l\'eliminazione dell\'insegnante.';
            this.isLoading = false;
          }
        });
      }
    });
  }

  // Gestisce il cambio di stato attivo/inattivo direttamente dalla tabella
  toggleActive(teacher: Teacher, event: MatSlideToggleChange): void {
    // event.stopPropagation(); // Non necessario/possibile con (change) di MatSlideToggleChange
    const updatedTeacher: TeacherInput = { is_active: !teacher.is_active };
    this.teacherService.updateTeacher(teacher.id, updatedTeacher).subscribe({
       next: () => this.loadTeachers(), // Ricarica per vedere lo stato aggiornato
       error: (err) => {
         console.error(`Error toggling active state for teacher ${teacher.id}:`, err);
         this.error = 'Errore durante l\'aggiornamento dello stato.';
         // Potrebbe essere utile ripristinare lo stato visivo del toggle in caso di errore
         this.loadTeachers();
       }
    });
  }
}
