import getpass
import os
import random
import sys
import time

from tqdm import tqdm

sys.path.append(os.path.join(sys.path[0], "../"))
from instabot import Bot  # noqa: E402


# initial


def initial_checker():
    files = [hashtag_file, users_file, whitelist, blacklist, comment, setting]
    try:
        for f in files:
            with open(f, "r") as f:
                pass
    except BaseException:
        for f in files:
            with open(f, "w") as f:
                pass
        print(
            """
        Welcome to instabot, it seems this is the first time you've used this bot.
        Before starting, let's setup the basics.
        So the bot functions the way you want.
        """
        )
        setting_input()
        print(
            """
        You can add hashtag database, competitor database,
        whitelists, blacklists and also add users in setting menu.
        Have fun with the bot!
        """
        )
        time.sleep(5)
        os.system("cls")


def read_input(f, msg, n=None):
    if n is not None:
        msg += " (enter to use default number: {})".format(n)
    print(msg)
    entered = sys.stdin.readline().strip() or str(n)
    if isinstance(n, int):
        entered = int(entered)
    f.write(str(entered) + "\n")


# setting function start here
def setting_input():
    inputs = [
        ("Bir günde kaç beğeni yapmak istersiniz?", 1000),
        ("Kaç beğeni yapılmasın istersin? ", 1000),
        ("Bir günde kaç takipçi yapmak istersin? ", 350),
        ("Kaç kişiyi takip etmesin istersin ?", 350),
        ("Bir günde kaç yorum yapmak istersin?", 100),
        (
            (
                "Medyadaki en yüksek beğeni değeri ?"
                "Bu değerden daha büyük olan medyayı atlayacağız "
            ),
            100,
        ),
        (
            (
                "Takip etmek istediğiniz maksimum hesap takipçisi mi var? \ N"
                "Bu değerden daha fazla takipçisi olan medyayı atlayacağız "
            ),
            2000,
        ),
        (
            (
                "Bir hesap takip etmeden önce sahip olması gereken minimum takipçisi mi? \ N"
                "Bu değerden daha az takipçisi olan medyayı atlayacağız "
            ),
            10,
        ),
        (
            (
                "Takip etmek istediğiniz hesabın maksimum takibi? \ N"
                "Bu değerden daha büyük olan medyayı atlayacağız "
            ),
            7500,
        ),
        (
            (
                "Takip etmek istediğiniz hesabın minimum takibi? \ N"
                "Bu değerden daha düşük olan medyayı atlayacağız "
            ),
            10,
        ),
        ("Takip eden orana kadar en çok takipçi ", 10),
        ("Takipçi oranına kadar maksimum takip ", 2),
        (
            (
                "İzleyeceğiniz(Takip) hesabın minimum medyası var. \ N"
                "Bu değerden daha az medya içeren medyayı atlayacağız "
            ),
            3,
        ),
        ("Beğeni arasındaki bekleme süresi", 10),
        ("Beğeni geri çekme arasındaki bekleme süresi ", 10),
        ("Takip etme arasındaki bekleme süresi ", 30),
        ("Takip bırakma arasındaki bekleme süresi ", 30),
        ("Yorumlar arası bekleme süresi ", 60),
        (
            "Proxy kullanmak ister misiniz? Proxy'nizi ekleyin veya yoksa boş bırakın. (sadece girin ",
            "None",
        ),
    ]

    with open(setting, "w") as f:
        while True:
            for msg, n in inputs:
                read_input(f, msg, n)
            break
        print("Tüm ayarlarla işiniz bitti!")


def parameter_setting():
    settings = [
        "Günde maksimum beğeni: ",
        "Günde maksimum beğenmeme: ",
        "Günde maksimum takip: ",
        "Günde maksimum takip bırakma: ",
        "Günde maksimum yorum ",
        "Maksimum beğendiğimi beğenme: ",
        "Maksimum takip ettiklerimin takipçilerini takip etme ",
        "Minimum takip ettiklerimin takipçilerini takip etme ",
        "Maksimum takipçilerimin takip ettiklerini takip etme ",
        "Minimum takipçilerimin takip ettiklerini takip etme ",
        "Maksimum takipçilerimin takip ettiklerinin oranı ",
        "Maksimum takipçilerimin takipçi oranı ",
        "Minimum medyasayısı (x) olanı takip et",
        "Beğeni gecikmesi ",
        "Unlike gecikmesi ",
        "Takip Gecikmesi ",
        "Takip bırakma gecikmesi ",
        "Yorum gecikmesi ",
        "Proxy: ",
    ]

    with open(setting) as f:
        data = f.readlines()

    print("Kullanılan Parametreler\n")
    for s, d in zip(settings, data):
        print(s + d)


def username_adder():
    with open(SECRET_FILE, "a") as f:
        print("İnstagram hesabınızı ekleyiniz")
        print("Endişelenme bilgiler yerel olarak depolanacaktır!")
        while True:
            print("Kullanıcı adını giriniz! ")
            f.write(str(sys.stdin.readline().strip()) + ":")
            print("Şifreyi giriniz (Şifreniz güvenlik gereği gösterilmemektedir"
                  "Şifreyi yazdıktan sonra Enter'a bas)")
            f.write(getpass.getpass() + "\n")
            print("Başka hesap eklemek istiyormusun? (y/n)")
            if "y" not in sys.stdin.readline():
                break


def get_adder(name, fname):
    def _adder():
        print("Mevcut veritabanı")
        print(bot.read_list_from_file(fname))
        with open(fname, "a") as f:
            print("Veritabanına {} ekle".format(name))
            while True:
                print("Enter {}: ".format(name))
                f.write(str(sys.stdin.readline().strip()) + "\n")
                print("Başka hesap eklemek istermisin? (y/n)\n".format(name))
                if "y" not in sys.stdin.readline():
                    print("Ekleme tamamlandı {}s veritabanı".format(name))
                    break

    return _adder()


def hashtag_adder():
    return get_adder("hashtag", fname=hashtag_file)


def competitor_adder():
    return get_adder("kullanıcı adı", fname=users_file)


def blacklist_adder():
    return get_adder("kullanıcı adı", fname=blacklist)


def whitelist_adder():
    return get_adder("kullanıcı adı", fname=whitelist)


def comment_adder():
    return get_adder("yorum", fname=comment)


def userlist_maker():
    return get_adder("kullanıcı adı", userlist)


# all menu start here


def menu():
    ans = True
    while ans:
        print(
            """
        1.Takip Et
        2.Beğeni
        3.Yorum
        4.Takip bırak
        5.Engelle
        6.Ayarlar
        7.Çıkış
        """
        )
        ans = input("Ne yapmak istersin?").strip()
        if ans == "1":
            menu_follow()
        elif ans == "2":
            menu_like()
        elif ans == "3":
            menu_comment()
        elif ans == "4":
            menu_unfollow()
        elif ans == "5":
            menu_block()
        elif ans == "6":
            menu_setting()
        elif ans == "7":
            bot.logout()
            sys.exit()
        else:
            print("\n Yanlış seçim, tekrar dene")


def menu_follow():
    ans = True
    while ans:
        print(
            """
        1. Hastag ile takip et
        2. Takip edenlerin takip ettikleri
        3. Takipçilerinin takip ettikleri
        4. Medyada beğenilere göre takip edin
        5. Ana Menü
        """
        )
        ans = input("Kimi takip etmek istersin?").strip()

        if ans == "1":
            print(
                """
            1.Hashtag gir
            2.Hashtag veri tabanını kullan
            """
            )
            hashtags = []
            if "1" in sys.stdin.readline():
                hashtags = (
                    input(
                        "Boşluklarla ayırarak hashtag ekleyin \Örnek: cat dog \Ne hashtag? \ "
                    )
                    .strip()
                    .split(" ")
                )
            else:
                hashtags = bot.read_list_from_file(hashtag_file)
            for hashtag in hashtags:
                print("Takip etmeye başla " + hashtag)
                users = bot.get_hashtag_users(hashtag)
                bot.follow_users(users)
            menu_follow()

        elif ans == "2":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            bot.follow_followers(user_id)
            menu_follow()

        elif ans == "3":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            bot.follow_following(user_id)
            menu_follow()

        elif ans == "4":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            medias = bot.get_user_medias(user_id, filtration=False)
            if len(medias):
                likers = bot.get_media_likers(medias[0])
                for liker in tqdm(likers):
                    bot.follow(liker)

        elif ans == "5":
            menu()

        else:
            print("Bu numara listede yok")
            menu_follow()


def menu_like():
    ans = True
    while ans:
        print(
            """
        1. Hashtag(s) ile beğeni
        2. Takipçilerini beğen 
        3. Takip ettiklerini beğen
        4. Son medya beğenileri gibi
        5. Zaman çizelgemiz gibi
        6. Ana Menü
        """
        )
        ans = input("Nasıl beğenmek istersin? ").strip()

        if ans == "1":
            print(
                """
            1.Hashtag(s) gir
            2.Hastag veritabanını kullan
            """
            )
            hashtags = []
            if "1" in sys.stdin.readline():
                hashtags = (
                    input(
                        "Insert hashtags separated by spaces\nExample: cat dog\nwhat hashtags?\n"
                    )
                    .strip()
                    .split(" ")
                )
            else:
                hashtags.append(random.choice(bot.read_list_from_file(hashtag_file)))
            for hashtag in hashtags:
                bot.like_hashtag(hashtag)

        elif ans == "2":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?\n").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            bot.like_followers(user_id)

        elif ans == "3":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?\n").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            bot.like_following(user_id)

        elif ans == "4":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("Kim?\n").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            medias = bot.get_user_medias(user_id, filtration=False)
            if len(medias):
                likers = bot.get_media_likers(medias[0])
                for liker in tqdm(likers):
                    bot.like_user(liker, amount=2, filtration=False)

        elif ans == "5":
            bot.like_timeline()

        elif ans == "6":
            menu()

        else:
            print("Bu numara listede yok?")
            menu_like()


def menu_comment():
    ans = True
    while ans:
        print(
            """
        1. Hashtag a yorum yap
        2. Belirli kullanıcı ortamlarını yorumlayın
        3. Yorum yapan kullanıcı listesi
        4. Zaman çizelgemizi yorumlayın
        5. Ana Menü
        """
        )
        ans = input("Nasıl yorum yapmak istersin?").strip()

        if ans == "1":
            print(
                """
            1.Hashtag gir
            2.Veri Tabanındaki hastagları kullan
            """
            )
            if "1" in sys.stdin.readline():
                hashtag = input("Ne?").strip()
            else:
                hashtag = random.choice(bot.read_list_from_file(hashtag_file))
            bot.comment_hashtag(hashtag)

        elif ans == "2":
            print(
                """
            1.Kullanıcı adı gir
            2.Veritabanındaki kullanıcıları kullan
            """
            )
            if "1" in sys.stdin.readline():
                user_id = input("who?\n").strip()
            else:
                user_id = random.choice(bot.read_list_from_file(users_file))
            bot.comment_medias(bot.get_user_medias(user_id, filtration=False))

        elif ans == "3":
            print(
                """
            1.Bir liste yap
            2.Mevcut listeyi kullan
            """
            )
            if "1" in sys.stdin.readline():
                userlist_maker()
            if "2" in sys.stdin.readline():
                print(userlist)
            users = bot.read_list_from_file(userlist)
            for user_id in users:
                bot.comment_medias(bot.get_user_medias(user_id, filtration=True))

        elif ans == "4":
            bot.comment_medias(bot.get_timeline_medias())

        elif ans == "5":
            menu()

        else:
            print("Bu numara listede yok mu?")
            menu_comment()


def menu_unfollow():
    ans = True
    while ans:
        print(
            """
        1. Takip etmeyenleri takipten çık
        2. Herkesi takipten çık
        3. Ana Menü
        """
        )
        ans = input("Takip etmeyi nasıl istiyorsun? \ N").strip()

        if ans == "1":
            bot.unfollow_non_followers()
            menu_unfollow()

        elif ans == "2":
            bot.unfollow_everyone()
            menu_unfollow()

        elif ans == "3":
            menu()

        else:
            print("Bu numara listede yok mu?")
            menu_unfollow()


def menu_block():
    ans = True
    while ans:
        print(
            """
        1. Bot engelle
        2. Ana Menü
        """
        )
        ans = input("Nasıl engellemek istersin?").strip()
        if ans == "1":
            bot.block_bots()
            menu_block()

        elif ans == "2":
            menu()

        else:
            print("Bu numara listede yok mu?")
            menu_block()


def menu_setting():
    ans = True
    while ans:
        print(
            """
        1. Bot parametresini ayarlama
        2. Kullanıcı hesabı ekle
        3. Rakip veritabanı ekle
        4. Hashtag veritabanı ekle
        5. Yorum veritabanı ekle
        6. Kara liste ekle
        7. Beyaz liste ekle
        8. Tüm veritabanını temizle
        9. Ana Menü
        """
        )
        ans = input("Hangi ayara ihtiyacınız var?").strip()

        if ans == "1":
            parameter_setting()
            change = input("Değiştirmek istiyormusun? y/n\n").strip()
            if change == "y" or change == "Y":
                setting_input()
            else:
                menu_setting()
        elif ans == "2":
            username_adder()
        elif ans == "3":
            competitor_adder()
        elif ans == "4":
            hashtag_adder()
        elif ans == "5":
            comment_adder()
        elif ans == "6":
            blacklist_adder()
        elif ans == "7":
            whitelist_adder()
        elif ans == "8":
            print(
                "Bu, kullanıcı hesaplarınız ve parametre ayarlarınız dışındaki tüm veritabanını temizler"
            )
            time.sleep(5)
            open(hashtag_file, "w")
            open(users_file, "w")
            open(whitelist, "w")
            open(blacklist, "w")
            open(comment, "w")
            print("Tamam, yenisini ekleyebilirsiniz!")
        elif ans == "9":
            menu()
        else:
            print("Bu numara listede yok mu?")
            menu_setting()


# for input compability
try:
    input = raw_input
except NameError:
    pass

# files location
hashtag_file = "hashtagsdb.txt"
users_file = "usersdb.txt"
whitelist = "whitelist.txt"
blacklist = "blacklist.txt"
userlist = "userlist.txt"
comment = "comment.txt"
setting = "setting.txt"
SECRET_FILE = "secret.txt"

# check setting first
initial_checker()

if os.stat(setting).st_size == 0:
    print("Ayar bozuldu gibi görünüyor")
    print("Yeni bir tane yapalım")
    setting_input()

f = open(setting)
lines = f.readlines()
setting_0 = int(lines[0].strip())
setting_1 = int(lines[1].strip())
setting_2 = int(lines[2].strip())
setting_3 = int(lines[3].strip())
setting_4 = int(lines[4].strip())
setting_5 = int(lines[5].strip())
setting_6 = int(lines[6].strip())
setting_7 = int(lines[7].strip())
setting_8 = int(lines[8].strip())
setting_9 = int(lines[9].strip())
setting_10 = int(lines[10].strip())
setting_11 = int(lines[11].strip())
setting_12 = int(lines[12].strip())
setting_13 = int(lines[13].strip())
setting_14 = int(lines[14].strip())
setting_15 = int(lines[15].strip())
setting_16 = int(lines[16].strip())
setting_17 = int(lines[17].strip())
setting_18 = lines[18].strip()

bot = Bot(
    max_likes_per_day=setting_0,
    max_unlikes_per_day=setting_1,
    max_follows_per_day=setting_2,
    max_unfollows_per_day=setting_3,
    max_comments_per_day=setting_4,
    max_likes_to_like=setting_5,
    max_followers_to_follow=setting_6,
    min_followers_to_follow=setting_7,
    max_following_to_follow=setting_8,
    min_following_to_follow=setting_9,
    max_followers_to_following_ratio=setting_10,
    max_following_to_followers_ratio=setting_11,
    min_media_count_to_follow=setting_12,
    like_delay=setting_13,
    unlike_delay=setting_14,
    follow_delay=setting_15,
    unfollow_delay=setting_16,
    comment_delay=setting_17,
    whitelist_file=whitelist,
    blacklist_file=blacklist,
    comments_file=comment,
    stop_words=[
        "order",
        "shop",
        "store",
        "free",
        "doodleartindonesia",
        "doodle art indonesia",
        "fullofdoodleart",
        "commission",
        "vector",
        "karikatur",
        "jasa",
        "open",
    ],
)

bot.login()

while True:
    try:
        menu()
    except Exception as e:
        bot.logger.info("error, read exception bellow")
        bot.logger.info(str(e))
    time.sleep(1)
