import { Component, Input, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from "@angular/router";
import { ToastrService } from "ngx-toastr";
import { ConfigService } from '@services/config.service';

@Component({
  selector: 'app-execute-command',
  templateUrl: './execute-command.component.html',
  styleUrls: ['./execute-command.component.css']
})
export class ExecuteCommandComponent implements OnInit {
  @Input() clientData: any[] = [];
  @Input() buttonType: 'icon' | 'text' = 'icon';
  @Input() buttonText: string = 'Ejecutar Comandos';
  @Input() icon: string = 'terminal';
  @Input() disabled: boolean = false;
  baseUrl: string;
  loading: boolean = true;

  arrayCommands: any[] = [
    { name: 'Enceder', slug: 'power-on', disabled: false },
    { name: 'Apagar', slug: 'power-off', disabled: false },
    { name: 'Reiniciar', slug: 'reboot', disabled: false },
    { name: 'Iniciar Sesión', slug: 'login', disabled: true },
    { name: 'Crear imagen', slug: 'create-image', disabled: false },
    { name: 'Clonar/desplegar imagen', slug: 'deploy-image', disabled: false },
    { name: 'Eliminar Imagen Cache', slug: 'delete-image-cache', disabled: true },
    { name: 'Particionar y Formatear', slug: 'partition', disabled: false },
    { name: 'Inventario Software', slug: 'software-inventory', disabled: true },
    { name: 'Inventario Hardware', slug: 'hardware-inventory', disabled: true },
    { name: 'Ejecutar script', slug: 'run-script', disabled: true },
  ];

  client: any = {};

  constructor(
    private http: HttpClient,
    private router: Router,
    private configService: ConfigService,
    private toastService: ToastrService
  ) {
    this.baseUrl = this.configService.apiUrl;
  }

  ngOnInit(): void {
    this.clientData = this.clientData || [];
  }

  onCommandSelect(action: any): void {
    if (action === 'partition') {
      this.openPartitionAssistant();
    }

    if (action === 'create-image') {
      this.openCreateImageAssistant();
    }

    if (action === 'deploy-image') {
      this.openDeployImageAssistant();
    }

    if (action === 'reboot') {
      this.rebootClient();
    }

    if (action === 'power-off') {
      this.powerOffClient();
    }

    if (action === 'power-on') {
      this.powerOnClient();
    }
  }

  rebootClient(): void {
    this.http.post(`${this.baseUrl}/clients/server/reboot`, {
      clients: this.clientData.map((client: any) => client['@id'])
    }).subscribe(
      response => {
        this.toastService.success('Cliente actualizado correctamente');
      },
      error => {
        this.toastService.error('Error de conexión con el cliente');
      }
    );
  }

  powerOnClient(): void {
    this.http.post(`${this.baseUrl}/image-repositories/wol`, {
      clients: this.clientData.map((client: any) => client['@id'])
    }).subscribe(
      response => {
        this.toastService.success('Petición de encendido enviada correctamente');
      },
      error => {
        this.toastService.error('Error de conexión con el cliente');
      }
    );
  }

  powerOffClient(): void {
    this.http.post(`${this.baseUrl}/clients/server/power-off`, {
      clients: this.clientData.map((client: any) => client['@id'])
    }).subscribe(
      response => {
        this.toastService.success('Petición de apagado enviada correctamente');
      },
      error => {
        this.toastService.error('Error de conexión con el cliente');
      }
    );
  }

  openPartitionAssistant(): void {
    this.router.navigate(['/clients/partition-assistant'], {
      state: { clientData: this.clientData },
    }).then(r => {
      console.log('Navigated to partition assistant with data:', this.clientData);
    });
  }

  openCreateImageAssistant(): void {
    this.router.navigate([`/clients/${this.clientData[0].uuid}/create-image`]).then(r => {
      console.log('navigated', r);
    });
  }

  openDeployImageAssistant(): void {
    this.router.navigate(['/clients/deploy-image'], {
      state: { clientData: this.clientData },
    }).then(r => {
      console.log('Navigated to deploy image with data:', this.clientData);
    });
  }
}
