extern crate glob;

use std::env;
use std::fs;
use std::path::Path;
use std::ffi::OsStr;

use std::io::prelude::*;

use self::glob::glob;

fn scan_and_append(out: &mut String, dir: &Path, gb: &str) {
    let mut pat = String::new();
    pat.push_str(dir.to_str().unwrap());
    pat.push_str("/");
    pat.push_str(gb);

    for entry in glob(pat.as_str()).unwrap() {
        if let Ok(path) = entry {
            let mut f = fs::File::open(path).unwrap();
            let mut content = String::new();
            f.read_to_string(&mut content).unwrap();
            out.push_str(content.as_str());
            out.push('\n');
        }
    }
}

fn main() {
    let src_dir_raw = env::var("CARGO_MANIFEST_DIR").unwrap();
    let out_dir_raw = env::var("OUT_DIR").unwrap();
    let src_dir = Path::new(OsStr::new(&src_dir_raw));
    let out_dir = Path::new(OsStr::new(&out_dir_raw));

    let db_dir = src_dir.join("db/");
    let sql_file = out_dir.join("git.rs.sql");

    let mut file = fs::File::create(sql_file).unwrap();
    let mut out = String::new();
    
    scan_and_append(&mut out, &db_dir, "headers/*.sql");
    scan_and_append(&mut out, &db_dir, "types/*.sql");
    scan_and_append(&mut out, &db_dir, "tables/*.sql");
    scan_and_append(&mut out, &db_dir, "functions/specials/*.sql");
    scan_and_append(&mut out, &db_dir, "indexes/*.sql");
    scan_and_append(&mut out, &db_dir, "views/*.sql");
    scan_and_append(&mut out, &db_dir, "functions/*.sql");

    file.write_all(out.as_bytes()).unwrap();
}