from __future__ import annotations

from typing import Any, List

import pandas as pd

COL_NS = {
    "region": "Регион РФ (область, край, город фед. значения, округ)",
    "area": "Административный район",
    "town": "Населённый пункт",
    "street": "Улица",
    "start_date": "Плановая дата начала отключения электроснабжения",
    "start_time": "Плановое время начала отключения электроснабжения",
    "finish_date": "Плановая дата восстановления отключения электроснабжения",
    "finish_time": "Плановое время восстановления отключения электроснабжения",
    "branch": "Филиал",
    "res": "РЭС",
    "comment": "Комментарий",
    "building_id": "ID здания",
    "lat": "Широта",
    "lng": "Долгота",
}

ICOL_NS = dict(map(reversed, COL_NS.items()))


def preprocess_df(df: pd.DataFrame) -> pd.DataFrame:
    df.rename(columns=ICOL_NS, inplace=True)

    for a in ("start", "finish"):
        df[f"{a}"] = pd.to_datetime(
            df[f"{a}_date"].astype(str) + " " + df[f"{a}_time"].astype(str),
            dayfirst=True,
        )
        df.drop(columns=[f"{a}_date", f"{a}_time"], inplace=True)

    return df


def preprocess_read_df(df: pd.DataFrame) -> pd.DataFrame:
    for name in ("start", "finish"):
        df[name] = pd.to_datetime(df[name])

    return df


def join_columns(col: pd.Series[Any]) -> List[Any] | Any:
    first = col.iloc[0]

    if col.name in ("street", "building_id", "lat", "lng") and pd.notnull(first):
        return list(col)

    return first


def group_by_index(df: pd.DataFrame) -> pd.DataFrame:
    groupped = df.groupby("index")

    res_df = groupped.apply(lambda index_df: index_df.apply(join_columns)).drop(
        columns="index"
    )

    return res_df