package com.classic.car.db;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import com.classic.car.consts.Consts;
import com.classic.car.db.dao.ConsumerDao;
import com.classic.car.entity.ConsumerDetail;
import com.classic.car.utils.CloseUtil;
import com.classic.car.utils.DataUtil;
import com.classic.car.utils.MoneyUtil;
import com.squareup.sqlbrite.BriteDatabase;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
public final class BackupManager {
private static final String SEPARATOR = "----";
private static final String REPLACE_STRING = "****";
private static final String EMPTY = "";
private static final String LINE_FEED = "\n";
private static final String CHART_SET = "UTF-8";
public int backup(@NonNull ConsumerDao consumerDao, @NonNull String filePath) {
List<ConsumerDetail> list = consumerDao.queryAllSync();
if (DataUtil.isEmpty(list)) {
return 0;
}
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(new File(filePath));
for (ConsumerDetail item : list) {
fileWriter.write(convertString(item));
}
return list.size();
} catch (IOException e) {
e.printStackTrace();
return -1;
} finally {
CloseUtil.close(fileWriter);
}
}
public boolean restore(@NonNull ConsumerDao consumerDao, @NonNull String filePath) {
File file = new File(filePath);
if (!file.exists()) {
return false;
}
BriteDatabase.Transaction transaction = consumerDao.getDatabase().newTransaction();
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
try {
inputStreamReader = new InputStreamReader(new FileInputStream(filePath), CHART_SET);
bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
ConsumerDetail item = convertConsumerDetail(line);
if (null != item) {
ConsumerDetail temp = consumerDao.queryByCreateTime(item.getCreateTime());
if (null == temp) {
consumerDao.insert(item);
} else if (item.getLastUpdateTime() > temp.getLastUpdateTime()) {
item.setId(temp.getId());
consumerDao.update(item);
}
}
}
transaction.markSuccessful();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
transaction.end();
CloseUtil.close(bufferedReader);
CloseUtil.close(inputStreamReader);
}
}
private ConsumerDetail convertConsumerDetail(String data) {
if (TextUtils.isEmpty(data)) {
return null;
}
String[] dataItem = data.split(SEPARATOR);
int type = Integer.valueOf(dataItem[0]);
if (type != Consts.TYPE_FUEL) {
String note = dataItem.length == 6 ?
(dataItem[5].contains(REPLACE_STRING) ? dataItem[5].replace(REPLACE_STRING, SEPARATOR) :
dataItem[5]) : EMPTY;
return new ConsumerDetail(type, Float.valueOf(dataItem[1]), Long.valueOf(dataItem[2]),
Long.valueOf(dataItem[3]), Long.valueOf(dataItem[4]), note);
}
String note = dataItem.length == 9 ?
(dataItem[8].contains(REPLACE_STRING) ? dataItem[8].replace(REPLACE_STRING, SEPARATOR) :
dataItem[8]) : EMPTY;
return new ConsumerDetail(type, Float.valueOf(dataItem[1]), Long.valueOf(dataItem[2]),
Long.valueOf(dataItem[3]), Long.valueOf(dataItem[4]), Integer.valueOf(dataItem[5]),
Float.valueOf(dataItem[6]), Long.valueOf(dataItem[7]), note);
}
private String convertString(ConsumerDetail detail) {
if (null == detail) return EMPTY;
final String notes = TextUtils.isEmpty(detail.getNotes()) ? EMPTY :
(detail.getNotes().contains(SEPARATOR) ? detail.getNotes().replace(SEPARATOR, REPLACE_STRING) :
detail.getNotes());
StringBuilder sb = new StringBuilder().append(detail.getType())
.append(SEPARATOR)
.append(MoneyUtil.replace(detail.getMoney()))
.append(SEPARATOR)
.append(detail.getLastUpdateTime())
.append(SEPARATOR)
.append(detail.getConsumptionTime())
.append(SEPARATOR)
.append(detail.getCreateTime());
if (detail.getType() == Consts.TYPE_FUEL) {
sb.append(SEPARATOR)
.append(detail.getOilType())
.append(SEPARATOR)
.append(MoneyUtil.replace(detail.getUnitPrice()))
.append(SEPARATOR)
.append(detail.getCurrentMileage());
}
if (!TextUtils.isEmpty(notes)) {
sb.append(SEPARATOR).append(notes);
}
return sb.append(LINE_FEED)
.toString();
}
}