package com.cpic.telsale.DataImport;

/**
 * Created by Kane on 2017/3/28.
 */

import java.io.*;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.apache.poi.hssf.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellType;

import com.cpic.util.staff.*;

public class DataImport
{
    private DataImport()
    {
    }

    /**
     * 读取xls表格插入数据，要么全部成功，要么全部失败。
     *
     * @param fileName                           xls文件名
     * @param telsalePolicyOperatorListTableName informix库电销转介绍表名
     * @param informixURL                        informix数据库URL
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws SQLException           数据库异常
     * @throws XlsFileFormatException xls文件格式错误异常
     */
    public static String importTelsalePolicyDataFromXlsx( String fileName,
                                                          String telsalePolicyOperatorListTableName,
                                                          String informixURL ) throws
            IOException,
            ClassNotFoundException,
            SQLException,
            XlsFileFormatException
    {
        String importResult = "";
        String importMessage = null;
        int rowIndex = 1; //excel文件行索引
        int rowCount = -1;
        int successCount = 0; //成功写入的行计数
        int failCount = 0; //写入失败的行计数

        //excel相关
        FileInputStream xlsFileIn = null;
        HSSFWorkbook xlsFile = null;
        HSSFSheet sheet = null;
        HSSFRow row = null;

        try
        {
            xlsFileIn = new FileInputStream( fileName );
            xlsFile = new HSSFWorkbook( xlsFileIn );
            sheet = xlsFile.getSheetAt( 0 ); //第一个sheet
            rowIndex = sheet.getFirstRowNum() + 1;
            rowCount = sheet.getLastRowNum();
            row = sheet.getRow( rowIndex );
        }
        catch( IOException error ) //有文件格式错误的可能。
        {
            xlsFile.close();
            xlsFileIn.close();

            throw new XlsFileFormatException( "文件格式错误，请检查是否xls格式文件。" );
        }

        //informix相关
        Class.forName( "com.informix.jdbc.IfxDriver" );
        String ifxSql =
                "INSERT INTO " + telsalePolicyOperatorListTableName + " \n" +
                        "    (bdh,\n" +
                        "     zhjywy,\n" +
                        "     zhjywymc,\n" +
                        "     kshdm,\n" +
                        "     kshmc,\n" +
                        "     zhjywybm,\n" +
                        "     zhjywybmm,\n" +
                        //"     chshdm,\n" +
                        //"     khmc,\n" +
                        //"     chph,\n" +
                        "     khjl,\n" +
                        "     khjllx,\n" +
                        "     jjbj,\n" +
                        "     czydm,\n" +
                        "     czrq)\n" +
                        "VALUES\n" +
                        "    (?,\n" +
                        "     ?,\n" +
                        "     ?,\n" +
                        "     ?,\n" +
                        "     ?,\n" +
                        "     ?,\n" +
                        "     ?,\n" +
                        //"     ?,\n" +
                        //"     ?,\n" +
                        //"     ?,\n" +
                        "     0,\n" +
                        "     0,\n" +
                        "     1,\n" +
                        "     '800',\n" +
                        "     today)";
        Connection ifxConn = DriverManager.getConnection( informixURL );
        PreparedStatement ifxStmt = ifxConn.prepareStatement( ifxSql );

        ifxConn.setAutoCommit( false );//关闭自动提交，整个表格要么全部成写入，要么全部失败。

        //数据相关
        String policyNo = null;
        String operatorCode = null;
        StaffInfo staff = null;
        boolean isSuccess = true; //标志位，用来指示在保存过程中是否出现错误。

        while ( rowIndex <= rowCount )
        {
            //用来判断是不是空行
            HSSFCell cell = row.getCell( 0 );

            if ( cell == null)
            {
                rowIndex++;
                continue;
            }

            policyNo = row.getCell( 0 ).getStringCellValue().trim();
            operatorCode = getStringValueFromHSSFCell( row.getCell( 1 ) );

            //判断一下是不是空的单元格
            if ( policyNo.length() == 0 || operatorCode.length() == 0 )
            {
                importResult = importResult + "第" + rowIndex + "行数据为空。<br>";

                //isSuccess = false;
            }
            else //不是空单元格，进行处理
            {
                try
                {
                    //取得经办人信息
                    staff = new StaffInfo( operatorCode );

                    //写入informix
                    ifxStmt.setString( 1, policyNo );
                    ifxStmt.setString( 2, staff.getStaffCode() );
                    ifxStmt.setString( 3, staff.getStaffName() );
                    ifxStmt.setString( 4, staff.getSectionOfficeCode() );
                    ifxStmt.setString( 5, staff.getSectionOfficeName() );
                    ifxStmt.setString( 6, staff.getDepartmentCode() );
                    ifxStmt.setString( 7, staff.getDepartmentName() );
                    //ifxStmt.setString( 8, getStringValueFromHSSFCell( row.getCell( 6 ) ) );
                    //ifxStmt.setString( 9, getStringValueFromHSSFCell( row.getCell( 3 ) ) );
                    //ifxStmt.setString( 10, getStringValueFromHSSFCell( row.getCell( 2 ) ) );

                    //ifxStmt.execute();

                    //成功写入提示
                    importResult = importResult + "第" + rowIndex + "行，保单号" + policyNo + "，转介绍信息入成功！<br>";

                    successCount++;
                }
                catch( StaffCodeNotExistException error )
                {
                    //经办人不存在
                    importResult = importResult + "第" + rowIndex + "行，保单号" + policyNo + ",经办人" + operatorCode + "不存在。<br>";

                    //标志位
                    isSuccess = false;

                    //计数
                    failCount++;
                }
                catch( SQLException error )
                {
                    int errorCode = error.getErrorCode();

                    switch ( errorCode )
                    {
                        case -268: //保单号重复
                            importResult = importResult + "第" + rowIndex + "行，保单号" + policyNo + ",已录入过转介绍信息！" + error.getCause() + "。<br>";
                            break;

                        default: //写入错误
                            importResult = importResult + "第" + rowIndex + "行，保单号" + policyNo + ",数据库写入错误，错误信息：" + error.getCause() + "。<br>";
                            break;
                    }

                    //标志位
                    isSuccess = false;

                    //计数
                    failCount++;
                }
                catch( Exception error )
                {
                    //写入错误
                    importResult = importResult + "第" + rowIndex + "行，保单号" + policyNo + ",数据库写入错误，错误信息：" + error.getMessage() + "。<br>";

                    //标志位
                    isSuccess = false;

                    //计数
                    failCount++;
                }
                finally
                {
                    ifxConn.commit();
                }
            }

            rowIndex++;
            row = sheet.getRow( rowIndex );
        }

        //判断标志位，如果为false，则说明在保存过程中出现了错误，放弃所有过程，进行回滚。
//        if ( isSuccess == true )
//        {
//            //oracleConn.commit();
//            ifxConn.commit();
//        }
//        else
//        {
//            ifxConn.rollback();
//        }

        //清理
        xlsFile.close();
        xlsFileIn.close();

        //日志
        importMessage = "读取记录数量：" + (rowIndex - 1) +
                "<br>写入记录数量：" + successCount +
                "<br>错误记录数量：" + failCount + "<br>";

//        if ( failCount != 0 )
//        {
//            //有错误的记录，输出提示
//            importMessage += "<br>请根据错误提示修正后重新导入！<br>";
//        }
//        else
//        {
//            //无错误的记录，输出成功提示
//            importMessage += "<br>文件已成功导入！<br>";
//        }

        //追加导入记录
        importMessage += importResult;

        return importMessage;
    }

    private static String getStringValueFromHSSFCell( HSSFCell cell )
    {
        String value = null;

        if ( cell == null )
        {
            return "";
        }

        switch ( cell.getCellType() )
        {
            case HSSFCell.CELL_TYPE_NUMERIC:
            {
                //判断是不是整数
                double dValue = cell.getNumericCellValue();

                if ( dValue == ( int )dValue )
                {
                    value = String.valueOf( ( int )dValue );
                }
                else
                {
                    value = String.valueOf( dValue );
                }

                break;
            }
            case HSSFCell.CELL_TYPE_STRING:
            {
                value = cell.getStringCellValue();
                break;
            }
            case HSSFCell.CELL_TYPE_BLANK:
            {
                value = "";
                break;
            }
            default:
            {
                value = "";
                break;
            }
        }

        return value;
    }
}


