#!/usr/bin/env python

"""
Brutemap is (c) 2019 By Brutemap Development Team.
See LICENSE for details.
"""

import os
import pickle

from lib.compat import file
from lib.compat import next
from lib.exceptions import BrutemapNullValueException

class Wordlist(object):
    """
    Kelas ini berfungsi untuk *mempercepat* proses pengambilan **kata** di file!
    jadi, anda dapat menggunakan file ukuran besar, tanpa harus menunggu lama (proses membaca).
    """

    def __init__(self, filenames):
        assert isinstance(filenames, list)
        self._filenames = filenames
        self._index = 0
        self._newlines = []
        self._fp = None

    def __iter__(self):
        # membuat klon objek, untuk proses bruteforce.
        # supaya, tidak mengurangi isi dari wordlist tersebut.
        return pickle.loads(pickle.dumps(self))

    def next(self):
        self.load()
        try:
            line = next(self._fp).rstrip()
            return line

        except AttributeError:
            return self.next()

        except StopIteration:
            if isinstance(self._fp, file):
                self._fp.close()
            self._fp = None
            return self.next()

    # untuk py3k
    __next__ = next

    def load(self):
        """
        Muat file selanjutnya atau *_newlines* jika tersedia.
        """

        if self._fp is None:
            # cek jika file belum di load semua
            if self._index < len(self._filenames):
                object_ = self._filenames[self._index]
                if os.path.isfile(object_):
                    object_ = open(object_, "r")
                else:
                    object_ = iter([object_])
                self._fp = object_
                # index file selanjutnya
                self._index += 1

            # cek jika file sudah di load semua
            elif self._index >= len(self._filenames) and len(self._newlines) != 0:
                # kemudian, load semua isi *_newlines*.
                self._fp = iter([self._newlines.pop(0)])

            else:
                # reset, jika data sudah di load semua.
                self._index = 0
                # lalu...
                raise BrutemapNullValueException # sebagai gantinya StopIteration
    
    def append(self, line):
        """
        Menambahkan line baru
        """

        self._newlines.append(line)