package comment;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import board.Board;
import comment.Comment;

public class CommentDAO {
	private Connection conn;
	private ResultSet rs;
	
	public CommentDAO() { // 데이터베이스 연결
   try {
			String dbURL = "jdbc:mysql://localhost:3306";
			String dbID = "DB 아이디";
			String dbPassword = "DB 비밀번호";
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public String getDate() { // 현재 날짜를 가져오는 함수
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL); // 데이터베이스에 접근할 때 충돌이 생기지 않도록 하기 위해 내부에 정의
			rs = pstmt.executeQuery();
			if(rs.next()) {
				return rs.getString(1); // 현재 날짜를 그대로 리턴
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 발생 시 빈 문자열 반환
	}
	
	public int getNext() { // 새로 작성할 댓글의 번호를 가져오는 함수
		String SQL = "SELECT commentID FROM COMMENT ORDER BY commentID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL); // 데이터베이스에 접근할 때 충돌이 생기지 않도록 하기 위해 내부에 정의
			rs = pstmt.executeQuery();
			if(rs.next()) {
				return rs.getInt(1) + 1; // 마지막 번호의 다음 번호를 리턴
			}
			return 1; // 새로 작성할 게시글이 첫 번째 게시글인 경우
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류 발생 시 -1 반환
	}
	
	public int comment(int writerID, String userID, String commentContent) { // 새로 작성한 게시글을 데이터베이스에 삽입
		String SQL = "INSERT INTO COMMENT VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1,  getNext());
			pstmt.setInt(2,  writerID);
			pstmt.setString(3,  userID);
			pstmt.setString(4,  getDate());
			pstmt.setString(5,  commentContent);
			pstmt.setInt(6,  1); // 처음엔 삭제가 안된 상태이므로
			
			return pstmt.executeUpdate(); // 성공적으로 실행한 경우
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류 발생 시 -1 반환
	}
	
	public ArrayList<Comment> getList(int writerID){ // 특정 게시글에 달린 댓글 리스트를 보여줌
		String SQL = "SELECT * FROM COMMENT WHERE writerID = ? AND commentAvailable = 1 ORDER BY commentID DESC";
		ArrayList<Comment> list = new ArrayList<Comment>(); // 댓글 리스트
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, writerID);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				Comment comment = new Comment();
				comment.setCommentID(rs.getInt(1));
				comment.setWriterID(rs.getInt(2));
				comment.setUserID(rs.getString(3));
				comment.setCommentDate(rs.getString(4));
				comment.setCommentContent(rs.getString(5));
				comment.setCommentAvailable(rs.getInt(6));
				
				list.add(comment); // 리스트에 데이터가 저장된 인스턴스를 넣음
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		return list; // 댓글 리스트를 반환해줌
	}
	
	public Comment getComment(int commentID) { // 하나의 댓글을 불러오는 함수
		String SQL = "SELECT * FROM COMMENT WHERE commentID = ?"; // 특정 댓글을 가져옴
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, commentID);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				Comment comment = new Comment();
				comment.setCommentID(rs.getInt(1));
				comment.setWriterID(rs.getInt(2));
				comment.setUserID(rs.getString(3));
				comment.setCommentDate(rs.getString(4));
				comment.setCommentContent(rs.getString(5));
				comment.setCommentAvailable(rs.getInt(6));
				
				return comment; // 해당 댓글의 정보를 반환
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null; // 댓글이 존재하지 않는 경우
	}
	
	public int update(int commentID, String commentContent) { // 댓글 수정
		String SQL = "UPDATE COMMENT SET commentContent = ? WHERE commentID = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setString(1,  commentContent);
			pstmt.setInt(2, commentID);

			return pstmt.executeUpdate(); // 성공적으로 실행한 경우
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류 발생 시 -1 반환
	}
	
	public int delete(int commentID) { // 댓글 삭제
		String SQL = "UPDATE COMMENT SET commentAvailable = 0 WHERE commentID = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, commentID);

			return pstmt.executeUpdate(); // 성공적으로 실행한 경우
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류 발생 시 -1 반환
	}
}