package com.magistr.app.service;

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

import java.time.Clock;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.zone.ZoneRulesException;
import java.util.Objects;

/** Единый источник бизнес-даты и абсолютного времени приложения. */
@Service
public class BusinessTimeService {

    public static final ZoneId DEFAULT_ZONE = ZoneId.of("Europe/Moscow");

    private final Clock clock;
    private final ZoneId zoneId;

    @Autowired
    public BusinessTimeService(@Value("${app.time.business-zone:Europe/Moscow}") String zoneId) {
        this(Clock.systemUTC(), parseZone(zoneId));
    }

    public BusinessTimeService(Clock clock, ZoneId zoneId) {
        this.clock = Objects.requireNonNull(clock, "Часы приложения обязательны");
        this.zoneId = Objects.requireNonNull(zoneId, "Часовой пояс бизнес-даты обязателен");
    }

    public LocalDate today() {
        return LocalDate.ofInstant(clock.instant(), zoneId);
    }

    public Instant now() {
        return clock.instant();
    }

    public ZoneId zoneId() {
        return zoneId;
    }

    public static BusinessTimeService systemDefault() {
        return new BusinessTimeService(Clock.systemUTC(), DEFAULT_ZONE);
    }

    private static ZoneId parseZone(String value) {
        try {
            return ZoneId.of(value == null || value.isBlank() ? DEFAULT_ZONE.getId() : value.trim());
        } catch (ZoneRulesException exception) {
            throw new IllegalStateException("Некорректный часовой пояс бизнес-даты: " + value, exception);
        }
    }
}
