# -*- coding: utf-8 -*-
# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors
#
# SPDX-License-Identifier: MIT

import logging
import os

import pandas as pd
import pypsa
from _helpers import configure_logging, set_scenario_config

logger = logging.getLogger(__name__)


BUSES_COLUMNS = [
    "bus_id",
    "voltage",
    "dc",
    "symbol",
    "under_construction",
    "x",
    "y",
    "country",
    "geometry",
]
LINES_COLUMNS = [
    "line_id",
    "bus0",
    "bus1",
    "voltage",
    "circuits",
    "length",
    "underground",
    "under_construction",
    "geometry",
]
LINKS_COLUMNS = [
    "link_id",
    "bus0",
    "bus1",
    "voltage",
    "p_nom",
    "length",
    "underground",
    "under_construction",
    "geometry",
]
TRANSFORMERS_COLUMNS = [
    "transformer_id",
    "bus0",
    "bus1",
    "voltage_bus0",
    "voltage_bus1",
    "geometry",
]
CONVERTERS_COLUMNS = [
    "converter_id",
    "bus0",
    "bus1",
    "voltage",
    "geometry",
]


def export_clean_csv(df, columns, output_file):
    """
    Export a cleaned DataFrame to a CSV file.

    Args:
        df (pandas.DataFrame): The DataFrame to be exported.
        columns (list): A list of column names to include in the exported CSV file.
        output_file (str): The path to the output CSV file.

    Returns:
        None
    """
    rename_dict = {
        "Bus": "bus_id",
        "Line": "line_id",
        "Link": "link_id",
        "Transformer": "transformer_id",
        "v_nom": "voltage",
        "num_parallel": "circuits",
    }

    if "converter_id" in columns:
        rename_dict["Link"] = "converter_id"

    df.reset_index().rename(columns=rename_dict).loc[:, columns].replace(
        {True: "t", False: "f"}
    ).to_csv(output_file, index=False, quotechar="'")

    return None


if __name__ == "__main__":
    if "snakemake" not in globals():
        from _helpers import mock_snakemake

        snakemake = mock_snakemake("prepare_osm_network_release")

    configure_logging(snakemake)
    set_scenario_config(snakemake)

    network = pypsa.Network(snakemake.input.base_network)

    network.buses["dc"] = network.buses.pop("carrier").map({"DC": "t", "AC": "f"})
    network.lines.length = network.lines.length * 1e3
    network.links.length = network.links.length * 1e3

    # Export to clean csv for release
    logger.info(f"Exporting {len(network.buses)} buses to %s", snakemake.output.buses)
    export_clean_csv(network.buses, BUSES_COLUMNS, snakemake.output.buses)

    logger.info(
        f"Exporting {len(network.transformers)} transformers to %s",
        snakemake.output.transformers,
    )
    export_clean_csv(
        network.transformers, TRANSFORMERS_COLUMNS, snakemake.output.transformers
    )

    logger.info(f"Exporting {len(network.lines)} lines to %s", snakemake.output.lines)
    export_clean_csv(network.lines, LINES_COLUMNS, snakemake.output.lines)

    # Boolean that specifies if link element is a converter
    is_converter = network.links.index.str.startswith("conv") == True

    logger.info(
        f"Exporting {len(network.links[~is_converter])} links to %s",
        snakemake.output.links,
    )
    export_clean_csv(
        network.links[~is_converter], LINKS_COLUMNS, snakemake.output.links
    )

    logger.info(
        f"Exporting {len(network.links[is_converter])} converters to %s",
        snakemake.output.converters,
    )
    export_clean_csv(
        network.links[is_converter], CONVERTERS_COLUMNS, snakemake.output.converters
    )

    logger.info("Export of OSM network for release complete.")