import os
from dotenv import load_dotenv
from kontur_focus.req import Request
from datetime import datetime


class Focus(Request):
    _basedir = os.path.abspath(os.path.dirname(__file__))

    def __init__(self, inn: str, ogrn: str = None):
        load_dotenv()
        super().__init__(
            base_url=os.environ.get('FOCUS_BASE_URL'),
            access_key=os.environ.get('FOCUS_ACCESS_KEY'),
            inn=inn,
            ogrn=ogrn
        )

    def base_info(self):
        """Выгрузка базовых реквизитов Российских юридических лиц и индивидуальных предпринимателей

        :return: Информация о ЮЛ
        :rtype: str
        """
        return self.get(path='/req')

    def advanced_info(self):
        """Расширенные сведения на основе ЕГРЮЛ/ЕГРИП

        :return: Информация о ЮЛ
        :rtype: str
        """
        return self.get('/egrDetails')

    def excerpt(self, path: str = None) -> dict:
        """Выписка из ЕГРЮЛ/ЕГРИП (только для РФ)

        :param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог.
        :type path: str, необязательный
        :return: Результат, имя файла и путь выгрузки
        :rtype: str
        """
        response = self.get('/excerpt')
        
        if type(response) is not str and response.status_code != 404:
            current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
            filename = f'Выписка_{self.inn}_{current_datetime}.pdf'

            if not path:
                file_path = os.path.join(self._basedir, filename)
            else:
                file_path = os.path.join(path, filename)

            try:
                with open(file_path, mode='wb') as file:
                    file.write(response.content)

                return {'success': True, 'filename': filename, 'path': file_path}
            except Exception as e:
                return {'success': False, 'message': e}
        else:
            return {'success': False, 'message': 'Not found'}

    def express_report(self, pdf: bool = True, path: str = None) -> dict:
        """Экспресс-отчет по контрагенту

        :param pdf: Выгрузить PDF файл, по-умолчанию True
        :type pdf: bool, optional
        :param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог.
        :type path: str, optional
        :return: _description_
        :rtype: _type_
        """
        response = self.get('/briefReport', pdf=pdf)
        current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
        filename = f'Экспресс-отчет_{self.inn}_{current_datetime}.pdf'
        
        if pdf:
            if not path:
                file_path = os.path.join(self._basedir, filename)
            else:
                file_path = os.path.join(path, filename)

            try:
                with open(file_path, mode='wb') as file:
                    file.write(response.content)

                return {'success': True, 'filename': filename, 'path': file_path}
            except Exception as e:
                return {'success': False, 'message': e}
        else:
            return response
    
    def finan(self, path: str = None):
        """В файле указана рейтинговая таблица и окончательное заключение о финансовых показателях компании.

        :param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог, defaults to None
        :type path: str, optional
        """
        response = self.get('/finan')
        current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
        filename = f'Финансовый_анализ_{self.inn}_{current_datetime}.pdf'
        
        if not path:
            file_path = os.path.join(self._basedir, filename)
        else:
            file_path = os.path.join(path, filename)
        
        try:
            with open(file_path, mode='wb') as file:
                file.write(response.content)

            return {'success': True, 'filename': filename, 'path': file_path}
        except Exception as e:
            return {'success': False, 'message': e}

    def founders_history(self):
        """История владения организацией

        :return: Набор полей с информацией об изменениях
        :rtype: str
        """
        return self.get('/foundersHistory')

    def foreign_representatives(self):
        """Иностранные представительства и филиалы

        :return: Набор данных о представительствах
        :rtype: str
        """
        return self.get('/foreignRepresentatives')

    def government_lists(self):  # DEPRECATED
        """Вхождение организации в государственные реестры

        :return: Список реестров
        :rtype: _type_
        """
        response = self.get('/analyticLists')
        
        return response['listsEntries']
    
    def is_foreign_agent(self):  # DEPRECATED
        """Проверка наличия организации в Едином реестре иностранных агентов

        :return: Результат проверки
        :rtype: bool
        """
        foreign_agents_list = next(lst for lst in self.government_lists() if lst['id'] == 'fcfc856d-89f8-408b-afef-56750cb90fed')
        
        return foreign_agents_list['isInList']

    def kz_company_details(self):
        response = self.get('/kz/companyDetails', bin=self.inn)
        return response[0] if response else None
