"""
SUMIT Public Exceptions and Warnings
"""


class JsonError(Exception):
    """Exception raised for errors envolving json."""

    def __init__(self, expression, type=False):
        if type:
            self.message_en = f'{expression} is not a valid json'
            self.message_fa = f'{expression} جیسون معتبری نیست'
        else:
            self.message_en = f"{expression} can't be jsonified"
            self.message_fa = f'امکان تبدیل {expression} به جیسون نیست'


class EmptyError(Exception):
    """Exception raised for errors envolving empty data/column."""

    def __init__(self, expression='', table=True, common=False, new=False):
        if table:
            self.message_en = f'data is empty'
            self.message_fa = f'داده خالی است'
        elif not common:
            self.message_en = f'column {expression} is empty'
            self.message_fa = f'ستون {expression} خالی است'
        elif new:
            self.message_en = 'No new data found'
            self.message_fa = 'داده‌ی جدیدی وجود ندارد'
        else:
            self.message_en = f'there is no common data for specified columns'
            self.message_fa = f'هیچ داده‌ی مشترکی برای ستون‌های انتخابی موجود نیست'


class ArgsError(Exception):
    """Exception raised for errors with args."""

    def __init__(self, expression, valid=True):
        if valid:
            self.message_en = f'{expression} should be specified'
            self.message_fa = f'{expression} باید مشخص شود'
        else:
            self.message_en = f'{expression} specified is not valid'
            self.message_fa = f'{expression}مشخص‌شده معتبر نیست '


class DtypeError(Exception):
    """Exception raised for errors in dtype."""

    def __init__(self, expression, all=False, col=False):
        if all:
            self.message_en = f'no {expression} column in data'
            self.message_fa = f' هیچ ستونی با تایپ{expression} در داده وجود ندارد'
        elif not col:
            self.message_en = f'all columns should have {expression} dtype'
            self.message_fa = f'تمامی ستون‌های انتخابی باید تایپ{expression} داشته باشند'
        else:
            self.message_en = f"columns {expression} doesn't have the same dtype as specified"
            self.message_fa = f'ستون {expression} دارای تایپ مشخص‌شده نیست '


class ClusterError(Exception):
    """Exception raised for errors in cluster/neighbor numbers."""

    def __init__(self):
        self.message_en = f'Number of rows with data is less than number of neighbors/clusters'
        self.message_fa = f'تعداد داده‌ها از تعداد همسایه‌ها/کلاسترهای انتخابی کمتر است'


class MethodError(Exception):
    """Exception raised for errors in the method."""

    def __init__(self, where=None, method=None):
        if not where:
            self.message_en = 'There was an error, please try again'
            self.message_fa = 'خطایی پیش آمده، لطفا مجددا تلاش کنید'
        if where == 'anova':
            if method == 'one_way':
                self.message_en = 'In one_way method length of columns is 1'
                self.message_fa = 'در روش one_way تعداد ستون باید ۱ باشد'
            elif method == 'two_way':
                self.message_en = 'In two_way method lenght of columns is 2, length of columns2 is 1 and there is no common columns between them'
                self.message_fa = 'در روش two_way تعداد ستون‌ها در شاخص اول ۲، شاخص دوم ۱ است و هیچ اشتراکی بین شاخص‌ها نباید باشد'
            else:
                self.message_en = 'In manova lenghth of columns is more than 1 and lenght of columns2 is more than 0'
                self.message_fa = 'در روش manova تعداد ستون‌ها در شاخص اول باید بیش از ۱ و در شاخص دوم بیش ۰ باشد'
        elif where == 'contingency':
            self.message_en = 'Please Specify two columns'
            self.message_fa = 'لطفا دو شاخص انتخاب کنید'
        elif where == 'qq':
            self.message_en = 'In on_way method 1 columns and in two_way 2 columns should be specified'
            self.message_fa = 'در روش on_way یک ستون و در روش two_way دو ستون باید مشخص شود'
        elif where == 'ttest':
            self.message_en = 'In singular method 1 columns and in dependent and independent methods 2 columns should be specified'
            self.message_fa = 'در روش singular یک ستون و در روش‌های dependent و independent دو ستون باید مشخص شود'
        elif where == 'regression':
            self.message_en = 'In Regression lenghth of columns & columns2 should be more than 0'
            self.message_fa = 'در روش رگرسیون تعداد ستون‌ها در شاخص اول و دوم باید بیش از ۰ باشد'


class DBError(Exception):
    """Exception raised for errors in database."""

    def __init__(self):
        self.message_en = 'Error with db'
        self.message_fa = 'مشکل در دیتابیس'


class ExistError(Exception):
    """Exception raised for errors envolving s.th's existance."""

    def __init__(self, expression='', col=False, intersection=False):
        if not col:
            self.message_en = f"{expression} doesn't exist"
            self.message_fa = f'{expression} وجود ندارد'
        else:
            self.message_en = f"column {expression} doesn't exist"
            self.message_fa = f'ستون {expression} وجود ندارد'
