package smash.appointment.parse;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFColor;

public class PrcSubjectsParser extends SubjectParser {

	@Override
	protected String parseScreeningNumber(Row row) {
		String number = getString(row.getCell(25));
		if (number.trim().isEmpty()) {
			return "";
		} else {
			if (number.length() == 1) {
				number = "00" + number;
			} else if (number.length() == 2) {
				number = "0" + number;
			}
			return "P-" + number;
		}
	}

	@Override
	protected String parseName(Row row) {
		return getString(row.getCell(1));
	}

	@Override
	protected String parseSurname(Row row) {
		return getString(row.getCell(0));
	}

	@Override
	protected String parseNdNumber(Row row) {
		return getString(row.getCell(22));
	}

	@Override
	protected String getSheetName() {
		return "Feuil1";
	}

	@Override
	protected int getInitRow() {
		return 1;
	}

	@Override
	protected String parseBirthDate(Row row) {
		return parseDateOfBirth(row.getCell(27));
	}

	@Override
	protected String parsemPowerId(Row row) {
		return getString(row.getCell(23));
	}

	@Override
	protected String parseAddDate(Row row) {
		return getDate(row.getCell(14), Calendar.getInstance());
	}

	@Override
	protected String parseReferal(Row row) {
		return getString(row.getCell(13));
	}

	@Override
	protected String parseDiagnosisYear(Row row) {
		return getString(row.getCell(11));
	}

	@Override
	protected String parseMail(Row row) {
		return getString(row.getCell(10));
	}

	@Override
	protected String parsePhone3(Row row) {
		return getString(row.getCell(9));
	}

	@Override
	protected String parsePhone2(Row row) {
		return getString(row.getCell(8));
	}

	@Override
	protected String parsePhone1(Row row) {
		return getString(row.getCell(7));
	}

	@Override
	protected String parseCity(Row row) {
		return getString(row.getCell(5));
	}

	@Override
	protected String parseCountry(Row row) {
		return getString(row.getCell(6));
	}

	@Override
	protected String parseZipCode(Row row) {
		return getString(row.getCell(4));
	}

	@Override
	protected String parseAddress(Row row) {
		return getString(row.getCell(3));
	}

	@Override
	protected String parseRemarks(Row row) {
		String remark1 = getString(row.getCell(2));
		String remark2 = getString(row.getCell(20));

		String result = "";
		if (!remark1.trim().isEmpty()) {
			result = result + remark1 + "\n";
		}
		if (!remark2.trim().isEmpty()) {
			result = result + remark2 + "\n";
		}
		return result;
	}

	@Override
	protected String parseDiagnosis(Row row) {
		return getString(row.getCell(12));
	}

	@Override
	protected SubjectType parseType(Row row) {
		return SubjectType.PATIENT;
	}

	@Override
	protected List<String> parseLanguages(Row row) {
		return new ArrayList<>();
	}

	@Override
	protected String parseToBeSeenAt(Row row) {
		return "P";
	}

	@Override
	protected boolean parseDead(Row row) {
		Color color = row.getCell(0).getCellStyle().getFillForegroundColorColor();
		if (color == null) {
			return false;
		}
		if (color instanceof XSSFColor) {
			return true;
		}
		if (color instanceof HSSFColor) {
			HSSFColor hssfColor = (HSSFColor) color;
			if (hssfColor.getHexString().equalsIgnoreCase("0:0:0")) {
				return false;
			} else {
				return true;
			}
		}
		return false;
	}

	@Override
	protected boolean parseResigned(Row row) {
		try {
			int colorId = row.getSheet().getWorkbook().getFontAt(row.getCell(0).getCellStyle().getFontIndex()).getColor();
			// special case for black
			if (colorId == 32767) {
				return false;
			}
			IndexedColors color = IndexedColors.fromInt(colorId);
			switch (color) {
				case RED:
					return true;
				case SEA_GREEN:
					return false;
				case PINK:
					return false;
				case PLUM:
					return false;
				case BLUE:
					return false;
				case BLACK:
					return false;
				case GREEN:
					return false;
				default:
					logger.debug("Unknown font color: " + color);
					return false;
			}
		} catch (Exception e) {
			logger.error("Problem with parsing color for subject: " + parseName(row) + " " + parseSurname(row), e);
			return false;
		}
	}

	@Override
	protected boolean parsePostponed(Row row) {
		return false;
	}
}