import {Component, Input, OnChanges, SimpleChanges} from '@angular/core';

interface ServicioAgenda {
	nombre_operador: string;
	hora_servicio: string;
	duracion_servicio: string;
	denominacion_cliente: string;
	start_day: string;
	end_day: string;
	color_estatus: string;
	nombre_estatus: string;
}

interface ServicioTimeline extends ServicioAgenda {
	leftPosition: number;
	width: number;
	topPosition: number;
}

@Component({
	selector: 'kt-timeline',
	templateUrl: './timeline.component.html',
	styleUrls: ['./timeline.component.scss']
})
export class TimelineComponent implements OnChanges {

	@Input() serviciosRaw: ServicioAgenda[] = [];
	@Input() isLoading: boolean = false;

	serviciosTimeline: ServicioTimeline[] = [];
	horasDelDia: string[] = [];
	horaInicio: number = 7;
	horaFin: number = 21;

	constructor() {
		this.generarHorasDelDia();
	}

	ngOnChanges(changes: SimpleChanges): void {
		if (changes.serviciosRaw) {
			this.procesarServicios();
		}
	}

	generarHorasDelDia(): void {
		this.horasDelDia = [];
		for (let i = this.horaInicio; i <= this.horaFin; i++) {
			const hora = i < 12 ? `${i}:00 AM` : (i === 12 ? '12:00 PM' : `${i - 12}:00 PM`);
			this.horasDelDia.push(hora);
		}
	}

	procesarServicios(): void {
		const totalHoras = this.horaFin - this.horaInicio;
		const operadoresMap: { [key: string]: number } = {};
		let operadorIndex = 0;

		this.serviciosTimeline = this.serviciosRaw.map(servicio => {
			const startDate = new Date(servicio.start_day);
			const endDate = new Date(servicio.end_day);

			const horaInicio = startDate.getHours() + startDate.getMinutes() / 60;
			const horaFin = endDate.getHours() + endDate.getMinutes() / 60;

			const leftPosition = ((horaInicio - this.horaInicio) / totalHoras) * 100;
			const width = ((horaFin - horaInicio) / totalHoras) * 100;

			// Asignar fila por operador
			const operador = servicio.nombre_operador || 'Sin asignar';
			if (operadoresMap[operador] === undefined) {
				operadoresMap[operador] = operadorIndex++;
			}
			const topPosition = operadoresMap[operador];

			return {
				...servicio,
				leftPosition: Math.max(0, leftPosition),
				width: Math.max(2, width),
				topPosition
			};
		});
	}

	getOperadores(): string[] {
		const operadores = new Set<string>();
		this.serviciosRaw.forEach(s => operadores.add(s.nombre_operador || 'Sin asignar'));
		return Array.from(operadores);
	}

	getServiciosPorOperador(operador: string): ServicioTimeline[] {
		return this.serviciosTimeline.filter(s =>
			(s.nombre_operador || 'Sin asignar') === operador
		);
	}

	getTotalServicios(): number {
		return this.serviciosRaw.length;
	}
}
