package idc.main.command;

import idc.model.IdcCmd;
import idc.model.IdcDAO;
import idc.model.IdcShareBoardDBDTO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class IdcShareBoardDownCmd implements IdcCmd
{
	IdcDAO dao;
	public IdcShareBoardDownCmd()
	{
		dao = new IdcDAO();
	}
	
	//공용자료실 데이터 다운로드.
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
	{
		IdcShareBoardDBDTO dto = new IdcShareBoardDBDTO();
		int num = Integer.parseInt(request.getParameter("num"));
		request.setAttribute("num", num);
		dtoSet(dto, num);

		idcShareBoardDownCmd(dto,response,request);
	}
	private void dtoSet(IdcShareBoardDBDTO dto,int num)
	{
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try	
		{
			conn=dao.getConn();
			String sql="SELECT filename,filepath,filesize FROM shareboarddb WHERE num=?";
			pstmt =conn.prepareStatement(sql);
			pstmt.setInt(1, num);
			
			rs=pstmt.executeQuery();
			while(rs.next())
			{
				dto.setFilename(rs.getString("filename"));
				dto.setFilepath(rs.getString("filepath"));
				dto.setFilesize(rs.getLong("filesize"));
			}
		}
		catch (Exception e) 
		{
			System.out.println("IdcShareBoardDownCmd - setdto에서의 exception");
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(conn!=null) conn.close();
				if(pstmt!=null)pstmt.close();
				if(rs!=null)rs.close();
			}
			catch (SQLException e) 
			{
				System.out.println("IdcShareBoardDownCmd - setdto 에서의 sqlexception");
				e.printStackTrace();
			}
		}
	}
	private void idcShareBoardDownCmd(IdcShareBoardDBDTO dto, HttpServletResponse response, HttpServletRequest request)
	{
		BufferedInputStream fis = null; 
		BufferedOutputStream fos = null;
		try
		{
			String path = dto.getFilepath();
			String fileName = dto.getFilename();
			long fileSize = dto.getFilesize();
			File file = new File(path);
			response.reset();
			
			response.setContentType("application/octet-stream");
			// 일반파라미터 application/x-www-form-urlencoded 디폴트로 설정 되있다!
			// 파일은 다르기 때문에 response 값을 바꾼것임
			
			// 해더의 이름에 내가 원하는 전송할 파일 이름을 넣은 것임
			// 파일이름은 브라우저 설정 문자셋으로 바뀐것으로 넣는다! 
			response.setHeader("Content-Disposition", "attachment;filename="+fileName+";");
			 // 인코딩 설정값도 변경
			response.setHeader("Content-Transper-Encoding", "binary");
			// 사이즈도 알려줘야 한다
			response.setContentLength((int)fileSize);
			// cache에 안 넣을 거다! 
			response.setHeader("Pargma", "no-cache");
			 // Expires 는 또 무슨 뜻인가염 넹?!
			response.setHeader("Expires", "-1");
			
			byte[] data = new byte[1024*1024];
			fis = new BufferedInputStream(new FileInputStream(file));
			
			fos = new BufferedOutputStream(response.getOutputStream());
			
			//read() -1이 나오면 파일의 끝이다.
			while(fis.read(data) != -1)
			{
				fos.write(data);
			}
		}
		catch(Exception e)
		{
			System.out.println("idcShareBoardDownCmd 에서의 exception");
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(fis!=null) fis.close();
				if(fos!=null) fos.close();
			} 
			catch (IOException e)
			{
				System.out.println("idcShareBoardDownCmd - 파일닫기 에서의 exception");
				e.printStackTrace();
			}
		}
	}
}
