# -*- coding:utf-8 -*-
"""
@author: yq
@time: 2023/12/28
@desc:  各种工具类
"""

import datetime
import inspect
import os
from json import JSONEncoder
import base64
import dataframe_image as dfi
import pandas as pd
import pytz

from config import BaseConfig


def f_format_float(num: float, n=3):
    return f"{num: .{n}f}"


def f_get_date(offset: int = 0, connect: str = "-") -> str:
    current_date = datetime.datetime.now(pytz.timezone("Asia/Shanghai")).date() + datetime.timedelta(days=offset)
    return current_date.strftime(f"%Y{connect}%m{connect}%d")


def f_get_datetime(offset: int = 0, connect: str = "_") -> str:
    current_date = datetime.datetime.now(pytz.timezone("Asia/Shanghai")) + datetime.timedelta(days=offset)
    return current_date.strftime(f"%Y{connect}%m{connect}%d{connect}%H{connect}%M{connect}%S")


def f_get_clazz_in_module(module):
    """
    获取包下的所有类
    """
    classes = []
    for name, member in inspect.getmembers(module):
        if inspect.isclass(member):
            classes.append(member)
    return classes


def f_save_train_df(file_name: str, df: pd.DataFrame):
    file_path = os.path.join(BaseConfig.train_path, file_name)
    df.to_excel(f"{file_path}.xlsx", index=False)


def f_df_to_image(df, filename, fontsize=12):
    dfi.export(obj=df, filename=filename, fontsize=fontsize, table_conversion='matplotlib')


def _f_image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        img_str = base64.b64encode(image_file.read())
        return img_str.decode("utf-8")


def f_display_images_by_side(image_path_list, display, title: str = "", width: int = 500):
    if isinstance(image_path_list, str):
        image_path_list = [image_path_list]
    html_str = '<div style="display:flex; justify-content:space-around;">'
    if title != "":
        html_str += '<h3>{}</h3>'.format(title)
    for image_path in image_path_list:
        html_str += f'<img src="data:image/png;base64,{_f_image_to_base64(image_path)}" style="width:{width}px;"/>'
    html_str += '</div>'
    display.display(display.HTML(html_str))


class f_clazz_to_json(JSONEncoder):
    def default(self, o):
        return o.__dict__