Newer
Older
smart-home / testowe / desc_gen.py
import re

def load_device_list(file_path):
    """Wczytuje listę urządzeń z pliku."""
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = [line.strip() for line in file if line.strip()]
    return lines

def parse_devices(lines):
    """Grupuje urządzenia według ID, pomijając te, które już mają opis."""
    devices = {}
    for line in lines:
        if '-' in line:  # Pomija urządzenia, które już mają opis
            continue
        match = re.match(r'rs\.0\.id\.(\d+)', line)
        if match:
            device_id = match.group(1)
            if device_id not in devices:
                devices[device_id] = []
            devices[device_id].append(line)
    return devices

def load_existing_descriptions(file_path):
    """Wczytuje istniejące opisy z pliku wynikowego."""
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            return {line.split(" - ")[0].strip(): line.strip() for line in file if " - " in line}
    except FileNotFoundError:
        return {}

def generate_descriptions(devices, existing_descriptions):
    """Interaktywnie generuje opisy dla urządzeń."""
    descriptions = {}
    try:
        for device_id, components in devices.items():
            print(f"\nID urządzenia: {device_id}")
            # Generowanie opisu głównego urządzenia
            if f"id {device_id}" in existing_descriptions:
                current_desc = existing_descriptions[f"id {device_id}"]
                print(f"Obecny opis: {current_desc.split(' - ', 1)[1]}")
                modify = input("Czy chcesz zmodyfikować ten opis? (tak/nie): ").strip().lower()
                if modify == "nie":
                    continue
            else:
                description = input(f"Podaj nowy opis dla ID {device_id} (np. wiatrołap/kuchnia): ").strip()
                if not description:
                    description = "brak"
                descriptions[device_id] = {f"id {device_id}": description}

            # Generowanie opisów dla komponentów urządzenia
            for component in components:
                if component in existing_descriptions:
                    current_desc = existing_descriptions[component]
                    print(f"Obecny opis: {current_desc.split(' - ', 1)[1]}")
                    modify = input(f"Czy chcesz zmodyfikować opis dla {component}? (tak/nie): ").strip().lower()
                    if modify == "nie":
                        continue
                component_desc = input(f"Podaj opis dla {component}: ").strip()
                if not component_desc:
                    component_desc = "brak"
                descriptions.setdefault(device_id, {})[component] = component_desc

    except (KeyboardInterrupt, EOFError):  # Obsługuje Ctrl+C i Ctrl+Z
        print("\nZatrzymano interakcję. Zapisywanie danych...")
        return descriptions, True
    
    return descriptions, False

def save_descriptions(file_path, descriptions, original_lines, existing_descriptions):
    """Zapisuje opisy do pliku, zachowując istniejącą strukturę."""
    with open(file_path, 'w', encoding='utf-8') as file:
        for line in original_lines:
            if '-' in line:
                file.write(line + '\n')
                continue
            if line in existing_descriptions:
                file.write(existing_descriptions[line] + '\n')
                continue
            match = re.match(r'rs\.0\.id\.(\d+)', line)
            if match:
                device_id = match.group(1)
                if device_id in descriptions and line in descriptions[device_id]:
                    file.write(f"{line} - {descriptions[device_id][line]}\n")
                else:
                    file.write(line + '\n')
            else:
                file.write(line + '\n')

def main():
    input_file = 'dok.txt'
    output_file = 'dok_output.txt'

    print("Wczytywanie urządzeń i istniejących opisów...")
    original_lines = load_device_list(input_file)
    devices = parse_devices(original_lines)
    existing_descriptions = load_existing_descriptions(output_file)
    
    if not devices:
        print("Brak urządzeń do opisania.")
        return
    
    print(f"Znaleziono {len(devices)} urządzeń do opisania.")
    
    all_descriptions = {}
    while devices:
        descriptions, should_exit = generate_descriptions(devices, existing_descriptions)
        all_descriptions.update(descriptions)
        if should_exit:
            break
    
    print("\nZapisywanie opisów do pliku...")
    save_descriptions(output_file, all_descriptions, original_lines, existing_descriptions)
    print(f"Opisy zapisano w pliku {output_file}.")
    print("Zakończono.")

if __name__ == "__main__":
    main()