from iso3166 import countries as co
from pandas import DataFrame, concat, read_csv
from csv import QUOTE_NONNUMERIC
from database.constants import ADMIN_PW
from os import path
from werkzeug.security import generate_password_hash


def country_conversion(political_unit) -> str:
    if political_unit == "99":
        return "99"
    codes = co.get(political_unit)
    return codes.name


def select_columns() -> DataFrame:
    min_year = 2010
    fields = [
        "POLITICAL_UNIT",
        "NAME",
        "WGMS_ID",
        "YEAR",
        "MEDIAN_ELEVATION",
        "AREA",
        "LENGTH",
    ]
    iter_csv = read_csv(
        "../data/WGMS-FoG-2019-12-B-STATE.csv",
        skipinitialspace=True,
        usecols=fields,
        iterator=True,
        chunksize=100,
        converters={"POLITICAL_UNIT": country_conversion},
    )
    data = concat([chunk[chunk["YEAR"] > min_year] for chunk in iter_csv])
    return data


def rename_fields(df_list):
    new_df_list = {}
    new_fields = {
        "POLITICAL_UNIT": "country",
        "NAME": "name",
        "WGMS_ID": "id",
        "YEAR": "year",
        "MEDIAN_ELEVATION": "elevation",
        "AREA": "surface",
        "LENGTH": "length",
    }
    for key, value in df_list.items():
        new_df_list[key] = value.rename(columns=new_fields)
    return new_df_list


def create_databases(df):
    files = {
        "glacier": "../data/glacier.csv",
        "annual_data": "../data/annual_data.csv",
        "user": "../data/user.csv",
    }
    user = {
        "id": [7843],
        "username": ["admin"],
        "password_hash": [generate_password_hash(ADMIN_PW)],
    }
    dataframes = {
        "glacier": df[["POLITICAL_UNIT", "NAME", "WGMS_ID"]].drop_duplicates(),
        "annual_data": df[["WGMS_ID", "YEAR", "AREA", "MEDIAN_ELEVATION", "LENGTH"]],
        "user": DataFrame(user),
    }
    renamed_dfs = rename_fields(dataframes)
    for key, val in renamed_dfs.items():
        if path.isfile(files[key]):
            continue
        val.to_csv(files[key], index=False, quoting=QUOTE_NONNUMERIC)


def main():
    df = select_columns()
    create_databases(df)


if __name__ == "__main__":
    main()