package osm.jp.coverage.busstop;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 国土数値情報から読み取ったデータをPostGISへインサートするためのSQLファイルに出力する。
 * 	出力ファイル名：	"busstop.sql"
 * 	テーブル名：		t_busstop
 * 	インデックス：	ix_busstop_geom
 * 		gid		PostGISの識別ID
 * 		name	バス停名称
 * 		fixed	OSMのバス停が周辺に存在するかどうか、存在しない場合は0,存在する場合はその数。
 * 		geom	PostGIS形式の位置情報(4612:)
 * @author yuu
 *
 */
public class ToPostgis {
	public static final String SQL_FILE_NAME = "busstop.sql";
	BufferedWriter ow = null;
	
	public ToPostgis(File dir) throws UnsupportedEncodingException, FileNotFoundException {
		File sqlFile = new File(dir, SQL_FILE_NAME);
		this.ow = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(sqlFile), "UTF-8"));
	}
	
    public int outputDb(Connection con) throws IOException, SQLException {
		
		int counter = 0;

		PreparedStatement ps8 = con.prepareStatement("SELECT idref,name,lat,lon,fixed,area FROM bus_stop");
		ResultSet rset8 = ps8.executeQuery();
		while (rset8.next()) {
			String idref = rset8.getString("idref");
			String name = rset8.getString("name");
			Double lat = rset8.getDouble("lat");
			Double lon = rset8.getDouble("lon");
			int score = rset8.getInt("fixed");
			int areacode = rset8.getInt("area");
			
			counter++;
			String osm_node = "insert into t_busstop(name,fixed,area,geom) VALUES('"+ escapeStr(name) +"',"+ score +","+ areacode +", ST_GeomFromText('POINT("+ Double.toString(lon) +" "+ Double.toString(lat) +")', 4612));";
			System.out.println(osm_node);
			this.ow.write(osm_node);
			this.ow.newLine();
		}
		rset8.close();
		this.ow.flush();
		return counter;
	}
    
    /**
     * postgresql 用に(')をエスケープする
     * 
     * @param name
     * @return
     */
    public String escapeStr(String name) {
    	return name.replaceAll("'", "''");
    }
    
    public void close() {
    	try {
			this.ow.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
}
