#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Скрипт конвертации item_group_codes.txt и item_group_codes_service.txt в Frappe fixtures формат.

Usage:
    cd /home/frappe/frappe-bench/apps/invoice_az
    python3 invoice_az/scripts/convert_item_groups_to_fixtures.py

Output:
    invoice_az/fixtures/e_taxes_item_group.json
"""

import json
import os
from datetime import datetime
from collections import Counter

# Paths
SOURCE_FILE_GOODS = "/home/frappe/frappe-bench/apps/invoice_az/item_group_codes.txt"
SOURCE_FILE_SERVICES = "/home/frappe/frappe-bench/apps/invoice_az/item_group_codes_service.txt"
OUTPUT_DIR = "/home/frappe/frappe-bench/apps/invoice_az/invoice_az/fixtures"
OUTPUT_FILE = os.path.join(OUTPUT_DIR, "e_taxes_item_group.json")

# Constants
MODIFIED_TIMESTAMP = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")


def validate_record(record, index):
	"""Валидация отдельной записи"""
	errors = []

	# Проверка обязательных полей
	if not record.get('code'):
		errors.append(f"Record {index}: Missing code")

	if not record.get('name', {}).get('az'):
		errors.append(f"Record {index}: Missing name.az")

	# Проверка длины name_az
	name_az = record.get('name', {}).get('az', '')
	if len(name_az) > 1500:
		errors.append(f"Record {index}: name_az too long ({len(name_az)} chars)")

	return errors


def load_groups_from_file(file_path, file_type):
	"""Загрузка групп из файла"""
	print(f"   Загрузка {file_type} из {file_path}...")

	try:
		with open(file_path, 'r', encoding='utf-8') as f:
			source_data = json.load(f)
	except FileNotFoundError:
		print(f"   ⚠ Файл не найден: {file_path}")
		return []
	except Exception as e:
		print(f"   ✗ Ошибка загрузки файла: {e}")
		return []

	groups = source_data.get('groups', [])
	print(f"   ✓ Загружено {len(groups)} записей ({file_type})")

	return groups


def convert_to_fixtures():
	"""Основная функция конвертации"""

	print("="*70)
	print("E-Taxes Item Group Fixtures Generator")
	print("="*70)

	# 1. Загрузка исходных данных
	print(f"\n[1/5] Загрузка данных из файлов...")

	groups_goods = load_groups_from_file(SOURCE_FILE_GOODS, "товары (goods)")
	groups_services = load_groups_from_file(SOURCE_FILE_SERVICES, "услуги (services)")

	# Проверка что хотя бы один файл загружен
	if not groups_goods and not groups_services:
		print(f"\n   ✗ ERROR: Не удалось загрузить ни один из файлов")
		return False

	# Объединяем группы
	groups = groups_goods + groups_services
	print(f"\n   ✓ Всего загружено {len(groups)} записей (товары: {len(groups_goods)}, услуги: {len(groups_services)})")

	# 2. Валидация данных
	print("\n[2/5] Валидация данных...")

	all_errors = []
	codes = []

	for idx, group in enumerate(groups):
		errors = validate_record(group, idx)
		all_errors.extend(errors)
		codes.append(group.get('code'))

	# Проверка уникальности кодов
	code_counts = Counter(codes)
	duplicates = {code: count for code, count in code_counts.items() if count > 1}

	if duplicates:
		print(f"   ⚠ Найдены дубликаты кодов (будут пропущены):")
		for code, count in list(duplicates.items())[:10]:
			print(f"     - {code}: {count} раз")
		if len(duplicates) > 10:
			print(f"     ... и еще {len(duplicates) - 10} дубликатов")

	if all_errors:
		print(f"   ✗ Найдено {len(all_errors)} ошибок валидации:")
		for error in all_errors[:10]:  # Показываем первые 10
			print(f"     - {error}")
		if len(all_errors) > 10:
			print(f"     ... и еще {len(all_errors) - 10} ошибок")
		return False

	print(f"   ✓ Валидация пройдена успешно")

	# 3. Анализ данных
	print("\n[3/5] Анализ данных...")

	types = Counter(g['type'] for g in groups)
	max_name_len = max(len(g['name']['az']) for g in groups)

	print(f"   - Типы товаров: {dict(types)}")
	print(f"   - Максимальная длина name_az: {max_name_len} символов")
	print(f"   - Уникальных кодов: {len(set(codes))}")

	# 4. Конвертация в fixtures формат
	print("\n[4/5] Конвертация в Frappe fixtures формат...")

	fixtures = []
	seen_codes = set()
	skipped_duplicates = 0

	for group in groups:
		code = group['code']

		# Пропускаем дубликаты (оставляем первое вхождение)
		if code in seen_codes:
			skipped_duplicates += 1
			continue

		seen_codes.add(code)

		fixture_record = {
			"docstatus": 0,
			"doctype": "E-Taxes Item Group",
			"modified": MODIFIED_TIMESTAMP,
			"name": code,  # autoname = field:code
			"code": code,
			"name_az": group['name']['az'],
			"item_type": group['type']
		}
		fixtures.append(fixture_record)

	print(f"   ✓ Конвертировано {len(fixtures)} записей")
	if skipped_duplicates > 0:
		print(f"   ⚠ Пропущено {skipped_duplicates} дубликатов")

	# 5. Сохранение в файл
	print(f"\n[5/5] Сохранение в {OUTPUT_FILE}...")

	# Создаем директорию fixtures если не существует
	os.makedirs(OUTPUT_DIR, exist_ok=True)

	try:
		with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
			json.dump(fixtures, f, ensure_ascii=False, indent=1)

		file_size = os.path.getsize(OUTPUT_FILE)
		print(f"   ✓ Файл сохранен успешно")
		print(f"   - Размер файла: {file_size / 1024 / 1024:.2f} MB")

	except Exception as e:
		print(f"   ✗ Ошибка сохранения: {e}")
		return False

	# Итоговая статистика
	print("\n" + "="*70)
	print("РЕЗУЛЬТАТ:")
	print("="*70)
	print(f"✓ Успешно обработано {len(fixtures)} товарных групп")
	print(f"✓ Fixture файл: {OUTPUT_FILE}")
	print(f"✓ Готово к установке через bench migrate")
	print("="*70)

	return True


if __name__ == "__main__":
	success = convert_to_fixtures()
	exit(0 if success else 1)
