import pandas as pd
import datetime
import os
import psycopg2
import math


class Database(object):
    connection = None
    cursor = None

    def __init__(self):
        self.connection = psycopg2.connect("""
                    host=
                    port=
                    dbname=
                    user=
                    password=
                    target_session_attrs=read-write
                    sslmode=require
                """)# sslmode=verify-full
        self.cursor = self.connection.cursor()

    def save_data_to_result_dataset(self, data):
        dt = pd.DataFrame(
            columns=['name','lastname','secondname','birthday','hometown','number_ip','credit',
                    'details','department','status','city','ip_date','year','credit_type','sum_rub',
                     'ip_sum','coord'])

        resp_count = 0

        length = len(data['response']['result'])
        for i in range(length):
            res = data['response']['result'][i]['result']

            length_res = len(res)
            if (length_res) > 0:
                resp_count += 1

            for j in range(0, length_res):
                el = len(dt)
                spl = res[j]['name'].split()
                dt.loc[el, 'name'] = spl[1]
                dt.loc[el, 'lastname'] = spl[0]
                dt.loc[el, 'secondname'] = spl[2]
                if (len(spl) > 3):
                    dt.loc[el, 'birthday'] = spl[3]
                else:
                    dt.loc[el, 'birthday'] = None
                s = ''
                len_s = len(spl)
                for k in range(4, len_s):
                    s += ' ' + spl[k]
                dt.loc[el, 'hometown'] = s
                dt.loc[el, 'number_ip'] = res[j]['exe_production']
                dt.loc[el, 'credit'] = res[j]['subject']
                dt.loc[el, 'details'] = res[j]['details']
                # dt.loc[el, 'department'] = res[j]['department']
                dt.loc[el, 'status'] = res[j]['ip_end']

                if(res[j]['department'] == 'Авиастроительное РОСП г.Казани УФССП России по Республике Татарстан 420127, г.Казань, ул.Копылова, д.12'):
                    dt.loc[el, 'department'] = 'Авиастроительный'
                elif(res[j]['department'] == 'Вахитовское РОСП г.Казани УФССП России по Республике Татарстан 420097, Россия, Респ. Татарстан, , г. Казань, , ул. Рабочей Молодежи, д. 9, , '):
                    dt.loc[el, 'department'] = 'Вахитовский'
                elif (res[j]['department'] == 'Кировское РОСП г.Казани УФССП России по Республике Татарстан 420095, Россия, , , г. Казань, , ул. Серова, 35, , '):
                    dt.loc[el, 'department'] = 'Кировский'
                elif (res[j]['department'] == 'МОСП по ОИП УФССП России по Республике Татарстан 420073, Россия, , , г. Казань, , ул. Курская, 3, , '):
                    dt.loc[el, 'department'] = 'Советский'
                elif (res[j]['department'] == 'Московское РОСП г.Казани УФССП России по Республике Татарстан 420095, Россия, , , г. Казань, , ул. Серова, 35, , '):
                    dt.loc[el, 'department'] = 'Московский'
                elif (res[j]['department'] == 'Ново-Савиновский РОСП г.Казани УФССП России по Республике Татарстан 420126, г. Казань, ул.Голубятникова, д.24'):
                    dt.loc[el, 'department'] = 'Ново-Савиновский'
                elif (res[j]['department'] == 'ОСП по ВАШ по г.Казани УФССП России по Республике Татарстан 42059, Россия, , , г. Казань, , ул. Оренбургский тракт, 5, , '):
                    dt.loc[el, 'department'] = 'Приволжский'
                elif (res[j]['department'] == 'ОСП №1 по Советскому району г.Казани УФССП России по Республике Татарстан 420088, Россия, Респ. Татарстан, , г. Казань, , ул. Ново-Азинская, 43, , '):
                    dt.loc[el, 'department'] = 'Советский'
                elif (res[j]['department'] == 'ОСП №2 по Советскому району г.Казани УФССП России по Республике Татарстан 420097, г. Казань, ул Рабочей молодежи, д.9'):
                    dt.loc[el, 'department'] = 'Советский'
                elif (res[j]['department'] == 'Приволжское РОСП г.Казани УФССП России по Республике Татарстан 420059, Россия, , , г. Казань, , ул. Павлюхина, 85, , '):
                    dt.loc[el, 'department'] = 'Приволжский'
                else: dt.loc[el, 'department'] = 'Другой'



        dt = dt[dt['department'].str.contains("Казан")]
        dt = dt.reset_index(drop=True)
        sql = '''insert into fssp_db values'''

        # преобразование полей
        for i in range(len(dt)):
            # получение даты и года
            arr = dt['number_ip'][i].split(' ')
            dt.loc[i, 'ip_date'] = arr[2]
            arr = dt['ip_date'][i].split('.')
            dt.loc[i, 'year'] = arr[2]

            # получение уникальных значений штрафов
            if (type(dt['credit'][i]) == str):
                if ('Исполнительский сбор' in dt['credit'][i]):
                    dt.loc[i, 'isp sbor'] = 1
                else:
                    dt.loc[i, 'isp sbor'] = 0
                arr = dt['credit'][i].split(': ')

                dt.loc[i, 'credit_type'] = arr[0]
                if len(arr) > 1:
                    if ('Исполнительский сбор' in arr[1]):
                        dt.loc[i, 'sum_rub'] = arr[1].split(' ')[0]
                        if len(arr) == 3:
                            dt.loc[i, 'ip_sum'] = arr[2].split()[0]

            #     обработка координат
            if ('Кировское РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.832872, 48.950958]'
            if ('ОСП по ВАШ' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.760223, 49.154474]'
            if ('Вахитовское РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.786442, 49.122618]'
            if ('ОСП №1 по Советскому району' in dt['department'][i] or 'ОСП №2 по Советскому' in dt['department'][i]
                    or 'МОСП по ОИП УФССП России' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.802816, 49.192901]'
            if ('Ново-Савиновский РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.830165, 49.128766]'
            if ('Приволжское РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.747341, 49.179552]'
            if ('Московское РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.831126, 49.065210]'
            if ('Авиастроительное РОСП' in dt['department'][i]):
                dt.loc[i, 'coord'] = '[55.855653, 49.084521]'

            # if math.isnan(dt['year'][i]):
            if type(dt['year'][i]) == float:
                if math.isnan(dt['year'][i]):
                    year = 'null'
                else:
                    year = dt['year'][i]
            else:
                year = dt['year'][i]

            # if dt['sum_rub'][i] == 'nan':
            if type(dt['sum_rub'][i]) == float:
                if math.isnan(dt['sum_rub'][i]):
                    sum_rub = 'null'
                else:
                    sum_rub = dt['sum_rub'][i]
            else:
                sum_rub = dt['sum_rub'][i]

            if type(dt['ip_sum'][i]) == float:
                if math.isnan(dt['ip_sum'][i]):
                    ip_sum = 'null'
                else:
                    ip_sum = dt['ip_sum'][i]
            else:
                ip_sum = dt['ip_sum'][i]



            val = '''('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}',{},'{}',{},{},'{}'),''' \
                .format(dt['name'][i], dt['lastname'][i], dt['secondname'][i], dt['birthday'][i],
                        dt['hometown'][i], dt['number_ip'][i],
                        dt['credit'][i], dt['details'][i], dt['department'][i], dt['status'][i],
                        'Казань', dt['ip_date'][i],
                        year, dt['credit_type'][i], sum_rub, ip_sum, dt['coord'][i])

            sql = sql + val
        sql = sql[:-1]
        self.cursor.execute(sql)
        self.connection.commit()
        print('отработал')

        #     добавляем обработанного челика в общую бд
        # db = self.add_to_db(dt)

    def add_to_db(self, data):
        # если папка существует
        if (os.path.exists('db')):
            print('Database exists')
            #     зайти в папку
            os.chdir('db')
            #     проверить файл в папке
            if not os.path.isfile('dataset.xlsx'):

                #         создать файл
                db = pd.DataFrame(
                    columns=['name', 'lastname', 'secondname', 'birthday', 'hometown', 'number_ip', 'credit',
                             'details',
                             'department', 'status'])

                db = pd.concat([db, data])
                db = db[db.columns.drop(list(db.filter(regex='^Unnamed')))]
                db.to_excel('dataset.xlsx')
            else:
                db = pd.read_excel('dataset.xlsx')
                db = db[db.columns.drop(list(db.filter(regex='^Unnamed')))]
                db = pd.concat([db, data])
                db.to_excel('dataset.xlsx')

            db = pd.read_excel('dataset.xlsx')
            db = db[db.columns.drop(list(db.filter(regex='^Unnamed')))]
            db.to_excel('dataset.xlsx')

            os.chdir('..')
            return db
        # если не существует
        else:
            print('Database doesn\'t exist')
            os.makedirs('db')
            os.chdir('db')
            db = pd.DataFrame(
                columns=['name', 'lastname', 'secondname', 'birthday', 'hometown', 'number_ip', 'credit', 'details',
                         'department', 'status'])
            db = pd.concat([db, data])
            #         db = db.loc[:, ~db.columns.str.contains('^Unnamed')]
            #         db.to_excel('dataset.xlsx')
            #         db = pd.read_excel('dataset.xlsx')
            db = db[db.columns.drop(list(db.filter(regex='^Unnamed')))]
            db.to_excel('dataset.xlsx')
            os.chdir('..')
            return db

    def load_person_dataset(self):
        dataset = pd.read_excel('person_dataset.xlsx')
        dataset = dataset[dataset.columns.drop(list(dataset.filter(regex='^Unnamed')))]
        return dataset

    def load_50_person_for_json(self, dataset):
        inds = dataset.index[dataset[:49]].tolist()
        indexes = [inds[0], inds[49]]
        dataset = dataset[dataset[inds[0]:inds[49]]]
        for i in range(len(dataset)):
            dataset['status'][i] = 2
        return dataset, indexes

    def update_people_status(self, status, indexes):
        df = self.load_person_dataset()
        for i in range(indexes[0], indexes[1]):
            df['status'][i] = status
        df = df[df.columns.drop(list(df.filter(regex='^Unnamed')))]
        df.to_excel('person_dataset.xlsx')

    def update_people_status_single_requests(self, index, status):
        df = self.load_person_dataset()
        df.loc[index, 'status'] = status
        df = df[df.columns.drop(list(df.filter(regex='^Unnamed')))]
        df.to_excel('person_dataset.xlsx')

    def load_tasks_db(self):
        tasks_db = pd.read_excel('tasks.xlsx')
        tasks_db = tasks_db[tasks_db.columns.drop(list(tasks_db.filter(regex='^Unnamed')))]
        return tasks_db

    def load_data_to_task_db(self, task, status, indexes):
        tasks_db = pd.read_excel('tasks.xlsx')
        tasks_db = tasks_db[tasks_db.columns.drop(list(tasks_db.filter(regex='^Unnamed')))]
        length = len(tasks_db)
        tasks_db.loc[length, 'task'] = task
        tasks_db.loc[length, 'status'] = status
        tasks_db.loc[length, 'time'] = datetime.datetime.now()
        tasks_db.loc[length, 'index1'] = indexes[0]
        tasks_db.loc[length, 'index2'] = indexes[1]
        tasks_db.to_excel("tasks.xlsx")

    def update_task_status(self, task, status):
        task_db = pd.read_excel('tasks.xlsx')
        task_db = task_db[task_db.columns.drop(list(task_db.filter(regex='^Unnamed')))]
        inds = task_db.index[task_db['task'] == task].tolist()
        task_db.iloc[inds[0], 'status'] = status
        task_db.to_excel('tasks.xlsx')
