let fs = require("fs");
let path = require("path");

function parseNumberFunctionFactory(keyMatcher, valueMatcher = /(\d+\.?\d*)/im,
                                    returnValueDecider = match => +match[1]) {
    return (data) => {
        let key = Object.keys(data).filter(_ => keyMatcher.test(_.trim()))[0];
        if (!key) return null;
        let match = data[key].toString().match(valueMatcher);
        if (match)
            return returnValueDecider(match);
        else
            return null;
    };
}

let parseResolution = parseNumberFunctionFactory(/^resolution$/im, /(\d+)\s*x\s*(\d+)/im, match => [+match[1], +match[2]]);
let parseFrameRate = parseNumberFunctionFactory(/frame rate/im);
let parseWeight = parseNumberFunctionFactory(/weight/im);
let parseAutoFocus = parseNumberFunctionFactory(/number of autofocus points/im);
let parseISO = parseNumberFunctionFactory(/ISO latitude/im, /(\d+)\s*-\s*(\d+)/im, match => [+match[1], +match[2]]);
let parseLaunchDate = parseNumberFunctionFactory(/launchDateGraph/im, /(\d+)-(\d+)-(\d+)/im, match => new Date(match[1], match[2] - 1, match[3]));
let parseTouchScreen = parseNumberFunctionFactory(/Touch screen/im, /yes/im, match => !!match);
let parseVideo = parseNumberFunctionFactory(/^Video$/m, /yes/im, match => !!match);
let parseFlash = parseNumberFunctionFactory(/^flash$/im, /yes/im, match => !!match);
let parseWaterproof = parseNumberFunctionFactory(/^waterproof$/im, /yes/im, match => !!match);
let parseBluetooth = parseNumberFunctionFactory(/^Bluetooth$/im, /yes/im, match => !!match);
let parseGps = parseNumberFunctionFactory(/^GPS$/im, /yes/im, match => !!match);
let parseIsMetal = parseNumberFunctionFactory(/^camera material$/im, /metal/im, match => !!match);

let files = fs.readdirSync("./scraped");
files.forEach(file => {
    let data = JSON.parse(fs.readFileSync(path.join('./scraped', file), { encoding: "utf8" }));
    let resolution = parseResolution(data);
    //机身材质质量
    let frameRate = parseFrameRate(data) || 4;
    let weight = parseWeight(data) || 500;
    let autoFocus = parseAutoFocus(data) || 6;
    let iso = parseISO(data);
    let launchDate = parseLaunchDate(data);
    let touchScreen = parseTouchScreen(data);
    let video = parseVideo(data);
    let flash = parseFlash(data);
    let waterproof = parseWaterproof(data);
    let bluetooth = parseBluetooth(data);
    let gps = parseGps(data);
    let isMetal = parseIsMetal(data);
    let cleanedData = {
        name: data.name,
        image: data.image,
        brand: data.brand,
        price: data.price,
        pixelDepth: data.pixelDepth,
        pixels: resolution ? (resolution[0] * resolution[1]) : 0,
        ISO: iso,
        maxISO: iso ? iso[1] : 0,
        launchDate: +launchDate,
        touchScreen,
        video,
        flash,
        waterproof,
        bluetooth,
        gps,
        isMetal,
        frameRate,
        resolution,
        weight,
        autoFocus,
    };
    fs.writeFileSync(path.join('./cleaned', file), JSON.stringify(cleanedData, null, 4), { encoding: "utf8" });
});
