package com.sptg.gateway.service;

import com.csvreader.CsvReader;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.common.core.beans.ResultEnum;
import com.sptg.permissions.api.entity.ImportExcelError;
import com.sptg.permissions.api.feigns.ImportExcelErrorFeign;
import org.springframework.scheduling.annotation.Async;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.util.List;

/**
 * @author WFT
 * @date 2020/6/11
 * description:
 */
public interface CsvService {

    /**
     * 获取标识
     * @return java.lang.String
     */
    String getFlag();

    /**
     * 获取模板名称
     * @return java.lang.String
     */
    String getTemplateName();

    /**
     * 保存数据
     * @param data java.lang.Object
     * @return com.sptg.common.core.beans.ResultBean
     */
    ResultBean<?> save(Object data);

    /**
     * 数组转对象
     * @param array 数据数组
     * @return 数据对象
     */
    Object arrToObj(String[] array) throws ParseException;

//    @Async
//    default void read(MultipartFile multipartFile, ImportExcelErrorFeign feign){
//        InputStream inputStream = null;
//        BufferedReader reader = null;
//        try{
//            inputStream = multipartFile.getInputStream();
//            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
//            //  读取首行
//            reader.readLine();
//            String line;
//            //  循环读取每一行记录
//            while((line = reader.readLine()) != null){
//                try{
//                    String[] array = line.split(",", -1);
//                    Assert.isTrue(this.getHeaderList().size() <= array.length,"数据格式不正确!");
//                    //  数组转对象
//                    Object data = this.arrToObj(array);
//                    if (null != data){
//                        //  保存记录
//                        ResultBean<?> result = this.save(data);
//                        //  校验是否保存成功
//                        Assert.notNull(result,"保存失败,服务器异常");
//                        Assert.isTrue(result.getCode().equals(ResultEnum.SUCCESS.getCode()),result.getMsg());
//                    }
//                }catch (Exception e){
//                    //  将错误信息写入数据库
//                    feign.add(new ImportExcelError(this.getFlag(),e.getMessage(), line));
//                }
//            }
//            System.out.println("导入结束:" + this.getFlag());
//        } catch (IOException e){
//            e.printStackTrace();
//        } finally {
//            if (null != reader){
//                try {
//                    reader.close();
//                }catch (IOException e){
//                    e.printStackTrace();
//                }
//            }
//            if (null != inputStream){
//                try{
//                    inputStream.close();
//                }catch (IOException e){
//                    e.printStackTrace();
//                }
//            }
//        }
//    }

    @Async
    default void read(MultipartFile multipartFile, ImportExcelErrorFeign feign){
        InputStream inputStream = null;
        CsvReader reader = null;
        try{
            inputStream = multipartFile.getInputStream();
            reader = new CsvReader(inputStream, ',', StandardCharsets.UTF_8);
            //读取首行（表头）
            reader.readHeaders();
            String rawRecord;
            //  循环读取每一行记录
            while(reader.readRecord()){
                rawRecord = reader.getRawRecord();
                try{
                    String[] array = reader.getValues();
                    Assert.isTrue(this.getHeaderList().size() <= array.length,"数据格式不正确!");
                    //  数组转对象
                    Object data = this.arrToObj(array);
                    if (null != data){
                        //  保存记录
                        ResultBean<?> result = this.save(data);
                        //  校验是否保存成功
                        Assert.notNull(result,"保存失败,服务器异常");
                        Assert.isTrue(result.getCode().equals(ResultEnum.SUCCESS.getCode()),result.getMsg());
                    }
                }catch (Exception e){
                    //  将错误信息写入数据库
                    feign.add(new ImportExcelError(this.getFlag(),e.getMessage(), rawRecord));
                }
            }
            System.out.println("导入结束:" + this.getFlag());
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            if (null != reader){
                reader.close();
            }
            if (null != inputStream){
                try{
                    inputStream.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

    List<String> getHeaderList();

}
