import logger from "./logger";
import {parse as csvParse} from "csv-parse";

async function openLogFile(filePath:string, rawData:boolean) {
    const data = await fetch(filePath).then(function(response) {
        return response.text();
    }).then(function(data) {
        return data;
    }).catch(function(error) {
        logger.error("Could not load log file: " + error.toString());
        return "";
    });
    
    if(rawData) {
        return data;
    } else {
        let logData:string[]|undefined = undefined;
        csvParse(data, {}, (err, output:string[]) => {
            if(err) {
                logger.errorMSG(`Error parsing csv file: ${err}`);
                logData = [];
            } else {
                logData = output;
            }
        });
        
        while(typeof logData === "undefined") {
            await new Promise(resolve => setTimeout(resolve, 100));
        }
        return logData;
    }
}

async function getLogTime(filePath:string) {
    return await openLogFile(filePath, false).then(function(data) {
        if(data.length > 0) {
            const time = data[1][1];
            const date = data[1][0];
            
            const endTime = data[data.length - 1][1];
            const endDate = data[data.length - 1][0];
            
            const dateList = date.split("-");
            const endDateList = endDate.split("-");
            
            const timeList = time.split(":");
            timeList.push(timeList[2].split(".")[1]);
            timeList[2] = timeList[2].split(".")[0];
            
            const endTimeList = endTime.split(":");
            endTimeList.push(endTimeList[2].split(".")[1]);
            endTimeList[2] = endTimeList[2].split(".")[0];
            
            const year = parseInt(dateList[0]);
            const month = parseInt(dateList[1]);
            const day = parseInt(dateList[2]);
            
            const hour = parseInt(timeList[0]);
            const minute = parseInt(timeList[1]);
            const second = parseInt(timeList[2]);
            const millisecond = parseInt(timeList[3]);
            
            let pastYears = parseInt(endDateList[0]) - year;
            let pastMonths = parseInt(endDateList[1]) - month;
            let pastDays = parseInt(endDateList[2]) - day;
            
            let pastHours = parseInt(endTimeList[0]) - hour;
            let pastMinutes = parseInt(endTimeList[1]) - minute;
            let pastSeconds = parseInt(endTimeList[2]) - second;
            let pastMilliseconds = parseInt(endTimeList[3]) - millisecond;
            
            if(pastMilliseconds < 0) {
                pastMilliseconds += 1000;
                pastSeconds--;
            }
            if(pastSeconds < 0) {
                pastSeconds += 60;
                pastMinutes--;
            }
            if(pastMinutes < 0) {
                pastMinutes += 60;
                pastHours--;
            }
            if(pastHours < 0) {
                pastHours += 24;
                pastDays--;
            }
            if(pastDays < 0) {
                pastDays += 30;
                pastMonths--;
            }
            if(pastMonths < 0) {
                pastMonths += 12;
                pastYears--;
            }
            
            return {
                start: {
                    year,
                    month,
                    day,
                    hour,
                    minute,
                    second,
                    millisecond
                },
                length: {
                    years: pastYears,
                    months: pastMonths,
                    days: pastDays,
                    hours: pastHours,
                    minutes: pastMinutes,
                    seconds: pastSeconds,
                    milliseconds: pastMilliseconds
                }
            }
        } else {
            return {
                start: {
                    year: 0,
                    month: 0,
                    day: 0,
                    hour: 0,
                    minute: 0,
                    second: 0,
                    millisecond: 0,
                },
                length: {
                    years: 0,
                    months: 0,
                    days: 0,
                    hours: 0,
                    minutes: 0,
                    seconds: 0,
                    milliseconds: 0
                }
            };
        }
    });
}

export {
    getLogTime
};