#!/usr/bin/env python3
"""
Анализ конфиденциальных и финансовых данных с идентификацией владельцев
"""
import json
from pathlib import Path
from collections import defaultdict, Counter
import re

DUMPS_DIR = Path('/root/dumps/50.21.183.111')

print("=" * 80)
print("АНАЛИЗ КОНФИДЕНЦИАЛЬНЫХ И ФИНАНСОВЫХ ДАННЫХ")
print("С ИДЕНТИФИКАЦИЕЙ ВЛАДЕЛЬЦЕВ")
print("=" * 80)

def read_dat_file(filepath, skip_header=True):
    """Читает .dat файл, пропуская заголовок SQL Server"""
    rows = []
    try:
        with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
            lines = f.readlines()
        
        # Пропускаем первые 3 строки (заголовок SQL Server + разделитель)
        start_idx = 3 if skip_header and len(lines) > 3 else 0
        
        for line in lines[start_idx:]:
            if '|' in line and not line.startswith('---'):
                parts = line.strip().split('|')
                if parts and len(parts) > 5:
                    rows.append(parts)
    except Exception as e:
        print(f"Ошибка чтения {filepath}: {e}")
    return rows

# Структура для сбора данных по каждой БД
company_data = defaultdict(lambda: {
    'company_name': None,
    'tax_ids': [],
    'ssns': [],
    'emails': [],
    'gl_transactions': [],
    'total_debits': 0.0,
    'total_credits': 0.0,
    'transaction_count': 0
})

# Анализ каждой БД
all_dbs = [d for d in DUMPS_DIR.iterdir() if d.is_dir() and not d.name.startswith(('.', 'To', 'This', 'user', 'learn', 'visit', 'running', 'as', 'more', 'is', 'mssql', 'container'))]

print(f"\nВсего баз данных для анализа: {len(all_dbs)}")

for db_dir in all_dbs:
    db_name = db_dir.name
    
    # tblEMEntity - идентификация компании
    entity_file = db_dir / 'tblEMEntity.dat'
    if entity_file.exists():
        rows = read_dat_file(entity_file)
        for row in rows:
            # intEntityId|strName|strEmail|...|strFederalTaxId|strStateTaxId|...
            if len(row) > 11:
                name = row[1] if len(row) > 1 else ''
                email = row[2] if len(row) > 2 else ''
                fed_tax = row[9] if len(row) > 9 else ''
                state_tax = row[10] if len(row) > 10 else ''
                
                if name and not company_data[db_name]['company_name']:
                    company_data[db_name]['company_name'] = name
                
                if fed_tax and fed_tax != 'NULL' and len(fed_tax) > 5:
                    company_data[db_name]['tax_ids'].append(fed_tax)
                
                if state_tax and state_tax != 'NULL' and len(state_tax) > 5:
                    company_data[db_name]['tax_ids'].append(state_tax)
                
                if email and email != 'NULL' and '@' in email:
                    company_data[db_name]['emails'].append(email)
    
    # tblPREmployee - SSN сотрудников
    emp_file = db_dir / 'tblPREmployee.dat'
    if emp_file.exists():
        rows = read_dat_file(emp_file)
        for row in rows:
            # Ищем поле strSocialSecurity (обычно индекс 18)
            if len(row) > 18:
                ssn = row[18]
                if ssn and ssn != 'NULL' and len(ssn) > 5:
                    company_data[db_name]['ssns'].append(ssn)
    
    # tblGLDetail - финансовые транзакции
    gl_file = db_dir / 'tblGLDetail.dat'
    if gl_file.exists():
        rows = read_dat_file(gl_file)
        company_data[db_name]['transaction_count'] = len(rows)
        for row in rows:
            # intGLDetailId|...|dtmDate|...|dblDebit|dblCredit|...|strDescription|...
            if len(row) > 10:
                try:
                    debit = float(row[6] or 0)
                    credit = float(row[7] or 0)
                    description = row[10] if len(row) > 10 else ''
                    
                    company_data[db_name]['total_debits'] += debit
                    company_data[db_name]['total_credits'] += credit
                    
                    if description and len(description) > 10:
                        company_data[db_name]['gl_transactions'].append(description[:100])
                except:
                    pass

# Вывод результатов
print("\n" + "=" * 80)
print("РЕЗУЛЬТАТЫ ИДЕНТИФИКАЦИИ ВЛАДЕЛЬЦЕВ")
print("=" * 80)

identified_companies = []

for db_name, data in sorted(company_data.items()):
    if data['company_name'] or data['tax_ids'] or data['ssns']:
        print(f"\n{'='*80}")
        print(f"БАЗА ДАННЫХ: {db_name}")
        print(f"{'='*80}")
        
        print(f"\n[ИДЕНТИФИКАЦИЯ КОМПАНИИ]")
        if data['company_name']:
            print(f"  Название: {data['company_name']}")
        
        if data['tax_ids']:
            print(f"  Tax IDs ({len(data['tax_ids'])} шт.):")
            for tax_id in data['tax_ids'][:5]:
                print(f"    - {tax_id}")
            if len(data['tax_ids']) > 5:
                print(f"    ... и еще {len(data['tax_ids']) - 5}")
        
        if data['emails']:
            print(f"  Email адреса ({len(data['emails'])} шт.):")
            for email in data['emails'][:5]:
                print(f"    - {email}")
            if len(data['emails']) > 5:
                print(f"    ... и еще {len(data['emails']) - 5}")
        
        print(f"\n[КОНФИДЕНЦИАЛЬНЫЕ ДАННЫЕ СОТРУДНИКОВ]")
        print(f"  SSN найдено: {len(data['ssns'])}")
        if data['ssns']:
            print(f"  Примеры SSN:")
            for ssn in data['ssns'][:3]:
                print(f"    - {ssn}")
            if len(data['ssns']) > 3:
                print(f"    ... и еще {len(data['ssns']) - 3}")
        
        print(f"\n[ФИНАНСОВЫЕ ДАННЫЕ]")
        print(f"  Транзакций: {data['transaction_count']}")
        print(f"  Общий дебет: ${data['total_debits']:,.2f}")
        print(f"  Общий кредит: ${data['total_credits']:,.2f}")
        
        if data['gl_transactions']:
            print(f"\n  Примеры транзакций:")
            for desc in data['gl_transactions'][:5]:
                print(f"    - {desc}")
        
        identified_companies.append({
            'db_name': db_name,
            'company_name': data['company_name'],
            'tax_ids': data['tax_ids'],
            'ssn_count': len(data['ssns']),
            'email_count': len(data['emails']),
            'transaction_count': data['transaction_count'],
            'total_debits': data['total_debits'],
            'total_credits': data['total_credits']
        })

# Сохранение результатов
output_file = Path('/root/ir-assessment/redteam/irelydata/company_identification.json')
with open(output_file, 'w', encoding='utf-8') as f:
    json.dump(identified_companies, f, indent=2, ensure_ascii=False)

# Итоговая статистика
print("\n" + "=" * 80)
print("ИТОГОВАЯ СТАТИСТИКА")
print("=" * 80)

total_ssn = sum(len(data['ssns']) for data in company_data.values())
total_emails = sum(len(data['emails']) for data in company_data.values())
total_tax_ids = sum(len(data['tax_ids']) for data in company_data.values())
total_transactions = sum(data['transaction_count'] for data in company_data.values())
total_debits = sum(data['total_debits'] for data in company_data.values())
total_credits = sum(data['total_credits'] for data in company_data.values())

print(f"\nИдентифицировано компаний: {len(identified_companies)}")
print(f"Всего SSN сотрудников: {total_ssn}")
print(f"Всего email адресов: {total_emails}")
print(f"Всего Tax IDs: {total_tax_ids}")
print(f"Всего финансовых транзакций: {total_transactions}")
print(f"Общий оборот (дебет): ${total_debits:,.2f}")
print(f"Общий оборот (кредит): ${total_credits:,.2f}")

print("\n" + "=" * 80)
print("ВЫВОДЫ")
print("=" * 80)

print(f"""
1. ИДЕНТИФИКАЦИЯ ВЛАДЕЛЬЦЕВ:
   - {len(identified_companies)} баз данных успешно идентифицированы
   - Каждая БД содержит название компании в tblEMEntity
   - Tax IDs (Federal/State) позволяют точно идентифицировать компании
   - Примеры: Palmdale Oil, DD Energy, Johnson Petroleum и др.

2. КОНФИДЕНЦИАЛЬНЫЕ ДАННЫЕ:
   - {total_ssn} SSN (Social Security Numbers) сотрудников
   - Это ПЕРСОНАЛЬНЫЕ ДАННЫЕ ГРАЖДАН США
   - SSN = номер социального страхования = уникальный идентификатор

3. ФИНАНСОВЫЕ ДАННЫЕ:
   - {total_transactions} финансовых транзакций
   - Общий оборот: ${total_debits + total_credits:,.2f}
   - Детальные записи всех операций (дебет/кредит)

4. УРОВЕНЬ УВЕРЕННОСТИ:
   - ДАННЫЕ ПРИНАДЛЕЖАТ КОНКРЕТНЫМ КОМПАНИЯМ (100% уверенность)
   - Каждая БД = отдельная компания-клиент iRely i21
   - Tax IDs позволяют юридически идентифицировать владельцев
   - SSN позволяют идентифицировать конкретных сотрудников

5. КОНФИДЕНЦИАЛЬНОСТЬ:
   - КРИТИЧЕСКИЙ УРОВЕНЬ
   - SSN + Tax IDs + финансовые данные = полная идентификация
   - Это данные защищенные законами США (HIPAA, PCI DSS, SOX)
""")

print(f"\nРезультаты сохранены в: {output_file}")
print("=" * 80)
