package auctiora;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Liveness;
import org.eclipse.microprofile.health.Readiness;
import org.eclipse.microprofile.health.Startup;

import java.nio.file.Files;
import java.nio.file.Paths;

/**
 * Health checks for Auction Monitor.
 * Provides liveness and readiness probes for Kubernetes/Docker deployment.
 */
@ApplicationScoped
public class AuctionMonitorHealthCheck {

    @Inject
    DatabaseService db;

    /**
     * Liveness probe - checks if application is alive
     * GET /health/live
     */
    @Liveness
    public static class LivenessCheck implements HealthCheck {
        @Override
        public HealthCheckResponse call() {
            return HealthCheckResponse.up("Auction Monitor is alive");
        }
    }

    /**
     * Readiness probe - checks if application is ready to serve requests
     * GET /health/ready
     */
    @Readiness
    @ApplicationScoped
    public static class ReadinessCheck implements HealthCheck {

        @Inject
        DatabaseService db;

        @Override
        public HealthCheckResponse call() {
            try {
                // Check database connection
                var auctions = db.getAllAuctions();

                // Check database path exists
                var dbPath = Paths.get("C:\\mnt\\okcomputer\\output\\cache.db");
                if (!Files.exists(dbPath.getParent())) {
                    return HealthCheckResponse.down("Database directory does not exist");
                }

                return HealthCheckResponse.named("database")
                    .up()
                    .withData("auctions", auctions.size())
                    .build();

            } catch (Exception e) {
                return HealthCheckResponse.named("database")
                    .down()
                    .withData("error", e.getMessage())
                    .build();
            }
        }
    }

    /**
     * Startup probe - checks if application has started correctly
     * GET /health/started
     */
    @Startup
    @ApplicationScoped
    public static class StartupCheck implements HealthCheck {

        @Inject
        DatabaseService db;

        @Override
        public HealthCheckResponse call() {
            try {
                // Verify database schema
                db.ensureSchema();

                return HealthCheckResponse.named("startup")
                    .up()
                    .withData("message", "Database schema initialized")
                    .build();

            } catch (Exception e) {
                return HealthCheckResponse.named("startup")
                    .down()
                    .withData("error", e.getMessage())
                    .build();
            }
        }
    }
}
