package library.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.Optional;

import library.db.DB;
import library.domain.Member;

/**
 * All SQL for SESSIONS.
 */
public class SessionDao {

	// Login: store a new token for a member
	public void insert(String token, int memberId, LocalDateTime expiresAt) throws SQLException {
		String sql = "INSERT INTO SESSIONS (token, member_id, expires_at) VALUES (?, ?, ?)";
		try (Connection conn = DB.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) {
			ps.setString(1, token);
			ps.setInt(2, memberId);
			ps.setObject(3, expiresAt);
			ps.executeUpdate();
		}
	}

	// Every request: the member a token belongs to, if the token exists and hasn't
	// expired.
	// "Now" comes from Java, like expires_at did, so both use the same clock.
	public Optional<Member> findMember(String token) throws SQLException {
		String sql = "SELECT m.member_id, m.username, m.password_hash, m.role "
				+ "FROM SESSIONS s JOIN MEMBERS m ON m.member_id = s.member_id "
				+ "WHERE s.token = ? AND s.expires_at > ?";
		try (Connection conn = DB.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) {
			ps.setString(1, token);
			ps.setObject(2, LocalDateTime.now());
			try (ResultSet rs = ps.executeQuery()) {
				if (!rs.next()) {
					return Optional.empty();
				}
				return Optional.of(new Member(rs.getInt("member_id"), rs.getString("username"),
						rs.getString("password_hash"), rs.getString("role")));
			}
		}
	}

	// Logout → false if the token wasn't there
	public boolean delete(String token) throws SQLException {
		String sql = "DELETE FROM SESSIONS WHERE token = ?";
		try (Connection conn = DB.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) {
			ps.setString(1, token);
			return ps.executeUpdate() == 1;
		}
	}
}
