package ua.tqs.service;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import ua.tqs.model.Bookings;
import ua.tqs.repository.BookingsRepository;


@Service
public class BookingsService {

    private final BookingsRepository repo;
    
    @Autowired
    public BookingsService(BookingsRepository repo) {
        this.repo = repo;
    }

    public Bookings createBooking(Bookings booking) {
        booking.setToken(UUID.randomUUID().toString().substring(0, 6).toUpperCase());
        booking.setDate(LocalDate.now());
        booking.setTime(LocalTime.now());
        booking.addStateChange(Bookings.State.RECEIVED);
        return repo.save(booking);
    }

    public List<Bookings> getAllBookings() {
        return repo.findAll();
    }

    public Optional<Bookings> getByToken(String token) {
        return repo.findByToken(token);
    }

    public Bookings updateState(String token, Bookings.State newState) {
        Bookings booking = repo.findByToken(token)
                .orElseThrow(() -> new IllegalArgumentException("Booking not found"));

        booking.addStateChange(newState);
        return repo.save(booking);
    }

    public String getStateHistory(String token) {
        Bookings booking = repo.findByToken(token)
                .orElseThrow(() -> new IllegalArgumentException("Booking not found"));

        return booking.getStateHistory();
    }

    public void deleteBooking(String token) {
        Bookings booking = repo.findByToken(token)
                .orElseThrow(() -> new IllegalArgumentException("Booking not found"));

        repo.delete(booking);
    }

}
