package test.it.cases;

import test.it.utils.log.TestResult;
import test.it.utils.ws.WsSession;

import java.time.Duration;
import java.util.List;

import static org.junit.jupiter.api.Assertions.fail;

/**
 * Seed_TestDataPopulation
 *
 * Заполняет тестовую соц-сеть через API:
 * - пользователи + HEADER через AddUser/AddBlock;
 * - параметры профиля (имя, фамилия, пол, адрес, web, phone, official, shine) через AddBlock USER_PARAM;
 * - связи (close friend/contact/follow/parent/child/sibling) через AddBlock CONNECTION;
 * - посты через AddBlock TEXT_POST.
 */
public class Seed_TestDataPopulation {

    // По требованию: пароль для сидов пустой (ключи детерминируются от "").
    private static final String PASSWORD = "";

    public static void main(String[] args) {
        System.out.println(run());
    }

    public static String run() {
        TestResult result = new TestResult("Seed_TestDataPopulation");
        Duration timeout = Duration.ofSeconds(20);

        try (WsSession ws = WsSession.open()) {
            SeedDataPopulationHelper seed = new SeedDataPopulationHelper(ws, result, timeout, PASSWORD);

            // -----------------------------------------------------------------
            // 1) Пользователи и профили
            // -----------------------------------------------------------------
            List<SeedDataPopulationHelper.UserSpec> users = buildUsers();
            seed.createUsersAndHeaders(users);
            seed.applyProfiles(users);

            // -----------------------------------------------------------------
            // 2) Базовые close friend: пользователи 1/2/3 взаимно связаны
            // -----------------------------------------------------------------
            seed.addMutualCloseFriend("1", "2");
            seed.addMutualCloseFriend("1", "3");
            seed.addMutualCloseFriend("2", "3");

            // -----------------------------------------------------------------
            // 3) Родители:
            //    - user1 <-> parents (взаимно)
            //    - user2 -> parents (только user2 добавил родителей)
            //    - parents -> user3 (только родители добавили user3)
            // -----------------------------------------------------------------
            seed.addParent("1", "u1_mom");
            seed.addParent("1", "u1_dad");
            seed.addChild("u1_mom", "1");
            seed.addChild("u1_dad", "1");

            seed.addParent("2", "u2_mom");
            seed.addParent("2", "u2_dad");

            seed.addChild("u3_mom", "3");
            seed.addChild("u3_dad", "3");

            // -----------------------------------------------------------------
            // 4) Дети и братья/сёстры
            // -----------------------------------------------------------------
            seed.addChild("1", "u1_son");
            seed.addParent("u1_son", "1");

            seed.addChild("2", "u2_daughter");
            seed.addParent("u2_daughter", "2");

            seed.addMutualSibling("1", "u1_bro");
            seed.addMutualSibling("2", "u2_sis");
            seed.addMutualSibling("3", "u3_bro");

            // -----------------------------------------------------------------
            // 5) Дополнительные close friend-связи (социальный граф)
            // -----------------------------------------------------------------
            seed.addMutualCloseFriend("1", "u1_friend");
            seed.addMutualCloseFriend("2", "u2_friend");
            seed.addMutualCloseFriend("3", "u3_friend");

            seed.addMutualCloseFriend("1", "shared_12");
            seed.addMutualCloseFriend("2", "shared_12");

            seed.addMutualCloseFriend("2", "shared_23");
            seed.addMutualCloseFriend("3", "shared_23");

            seed.addMutualCloseFriend("u1_friend", "u2_friend");
            seed.addMutualCloseFriend("2", "u3_friend");
            seed.addMutualCloseFriend("3", "u2_friend");
            seed.addMutualCloseFriend("2", "u2_sis");

            // Смешанные связи по задаче:
            // сестра пользователя 2 является close friend пользователя 3
            seed.addMutualCloseFriend("u2_sis", "3");
            // чей-то отец как close friend
            seed.addMutualCloseFriend("u1_dad", "shared_12");
            seed.addMutualCloseFriend("u2_dad", "u3_friend");

            // -----------------------------------------------------------------
            // 6) Контакты (user1 ~10, user2 ~5, user3 ~7)
            // -----------------------------------------------------------------
            addContacts(seed, "1",
                    "2", "3",
                    "u1_mom", "u1_dad", "u1_son", "u1_bro",
                    "u1_friend", "shared_12",
                    "star_alfa", "star_beta");

            addContacts(seed, "2",
                    "1", "3",
                    "u2_mom", "u2_dad", "u2_daughter");

            addContacts(seed, "3",
                    "1", "2",
                    "u3_mom", "u3_dad", "u3_bro",
                    "shared_23", "star_gamma");

            // -----------------------------------------------------------------
            // 7) Подписки
            //    user1 и user2 подписаны на 3 популярных аккаунта; user3 ни на кого не подписан.
            // -----------------------------------------------------------------
            addFollows(seed, "1", "star_alfa", "star_beta", "star_gamma");
            addFollows(seed, "2", "star_alfa", "star_beta", "star_gamma");

            // Дополнительные подписки популярных аккаунтов и друзей
            seed.addFollow("star_alfa", "star_beta");
            seed.addFollow("star_beta", "star_gamma");
            seed.addFollow("star_gamma", "star_alfa");
            seed.addFollow("u1_friend", "star_alfa");
            seed.addFollow("u2_friend", "star_beta");

            // -----------------------------------------------------------------
            // 8) Посты
            // -----------------------------------------------------------------
            // Посты популярных аккаунтов
            seed.addPost("star_alfa", "Сегодня в 20:00 эфир: как расти в соцсетях без выгорания.");
            seed.addPost("star_alfa", "Подборка сервисов для авторов: редакторы, аналитика, планировщики.");

            seed.addPost("star_beta", "Max Trend: weekly update. New ideas, less noise.");
            seed.addPost("star_beta", "Делюсь коротким чек-листом: как стартовать канал за 1 день.");

            seed.addPost("star_gamma", "NeoPulse: сделал новый обзор по AI-инструментам для контента.");
            seed.addPost("star_gamma", "Сегодня без эфиров, только ответы в комментариях.");

            // Посты о себе у пользователей 1 и 2 (по несколько)
            seed.addPost("1", "Я — Друг 1. Люблю тестировать новые фичи приложения и писать заметки о городе.");
            seed.addPost("1", "Проверяю вкладку «Связи»: родители, дети, братья и близкие друзья.");
            seed.addPost("1", "Если увидите баг по линиям/стрелкам — пишите, поправим.");

            seed.addPost("2", "Я — Друг 2. Сейчас настраиваю профиль и заполняю контакты.");
            seed.addPost("2", "Подписался на популярных авторов, смотрю их ленту и обсуждения.");

            // Несколько дополнительных постов для живости
            seed.addPost("u3_friend", "Сегодня был в дороге, позже выложу фото и адреса мест.");
            seed.addPost("shared_23", "У кого есть идеи по совместному стриму на выходных?");

            result.ok("Тестовые данные заполнены: 20+ пользователей, семейные связи, close friends, контакты, подписки и посты.");
        } catch (Throwable e) {
            result.fail("Ошибка seed: " + e.getMessage());
            fail("Seed_TestDataPopulation failed", e);
        }

        return result.summaryLine();
    }

    private static void addContacts(SeedDataPopulationHelper seed, String owner, String... contacts) {
        for (String contact : contacts) {
            seed.addContact(owner, contact);
        }
    }

    private static void addFollows(SeedDataPopulationHelper seed, String owner, String... targets) {
        for (String target : targets) {
            seed.addFollow(owner, target);
        }
    }

    private static List<SeedDataPopulationHelper.UserSpec> buildUsers() {
        return List.of(
                // Базовые 1/2/3 (входные тестовые аккаунты)
                SeedDataPopulationHelper.user("1", "Друг 1", "Иванов")
                        .male()
                        .address("Москва, Тверская улица, 10")
                        .web("telegram:@drug1, viber:+79990000001, site:https://drug1.local")
                        .phone("+7 900 000-00-01")
                        .shine(true),

                SeedDataPopulationHelper.user("2", "Друг 2", "Петров")
                        .male()
                        .address("Санкт-Петербург, Невский проспект, 22")
                        .web("telegram:@drug2, instagram:@drug2_live")
                        .phone("+7 900 000-00-02"),

                SeedDataPopulationHelper.user("3", "Друг 3", "Смирнов")
                        .male()
                        .address("Казань, улица Баумана, 7")
                        .web("telegram:@drug3, site:https://drug3.space")
                        .phone("+7 900 000-00-03"),

                // Родители 1/2/3
                SeedDataPopulationHelper.user("u1_mom", "Марина", "Иванова")
                        .female()
                        .address("Москва, Кутузовский проспект, 31")
                        .web("telegram:@marina_ivanova"),
                SeedDataPopulationHelper.user("u1_dad", "Сергей", "Иванов")
                        .male()
                        .address("Москва, Кутузовский проспект, 31")
                        .web("viber:+79995550101"),

                SeedDataPopulationHelper.user("u2_mom", "Ольга", "Петрова")
                        .female()
                        .address("Санкт-Петербург, Литейный проспект, 9")
                        .web("telegram:@olga_petrova"),
                SeedDataPopulationHelper.user("u2_dad", "Андрей", "Петров")
                        .male()
                        .address("Санкт-Петербург, Литейный проспект, 9")
                        .web("site:https://petrov-family.ru"),

                SeedDataPopulationHelper.user("u3_mom", "Елена", "Смирнова")
                        .female()
                        .address("Казань, улица Декабристов, 12"),
                SeedDataPopulationHelper.user("u3_dad", "Игорь", "Смирнов")
                        .male()
                        .address("Казань, улица Декабристов, 12"),

                // Дети
                SeedDataPopulationHelper.user("u1_son", "Кирилл", "Иванов")
                        .male()
                        .web("telegram:@kirill_ivanov_jr"),
                SeedDataPopulationHelper.user("u2_daughter", "Алиса", "Петрова")
                        .female(),

                // Братья/сёстры
                SeedDataPopulationHelper.user("u1_bro", "Антон", "Иванов")
                        .male()
                        .web("telegram:@anton_ivanov"),
                SeedDataPopulationHelper.user("u2_sis", "Наталья", "Петрова")
                        .female()
                        .web("telegram:@natasha_petrova"),
                SeedDataPopulationHelper.user("u3_bro", "Максим", "Смирнов")
                        .male(),

                // Друзья пользователей
                SeedDataPopulationHelper.user("u1_friend", "Дмитрий", "Лебедев")
                        .male()
                        .address("Тула, Советская улица, 4"),
                SeedDataPopulationHelper.user("u2_friend", "Вера", "Кузнецова")
                        .female()
                        .address("Екатеринбург, улица Малышева, 44"),
                SeedDataPopulationHelper.user("u3_friend", "Роман", "Орлов")
                        .male()
                        .address("Нижний Новгород, Большая Покровская, 15"),

                // Общие друзья для связок 1-2 и 2-3
                SeedDataPopulationHelper.user("shared_12", "Михаил", "Громов")
                        .male()
                        .web("telegram:@m_gromov, site:https://gromov.media"),
                SeedDataPopulationHelper.user("shared_23", "София", "Громова")
                        .female()
                        .web("instagram:@sofia_gromova"),

                // Популярные аккаунты
                SeedDataPopulationHelper.user("star_alfa", "Анна", "Звезда")
                        .female()
                        .official(true)
                        .shine(true)
                        .web("telegram:@anna_star, instagram:@annastar, site:https://annastar.pro"),

                SeedDataPopulationHelper.user("star_beta", "Max", "Trend")
                        .male()
                        .official(true)
                        .web("telegram:@maxtrend, site:https://maxtrend.io"),

                SeedDataPopulationHelper.user("star_gamma", "Neo", "Pulse")
                        .unknownGender()
                        .official(true)
                        .shine(true)
                        .web("site:https://neopulse.media, instagram:@neo.pulse"),

                // Дополнительный англоязычный профиль
                SeedDataPopulationHelper.user("en_guest", "Alex", "Miller")
                        .male()
                        .address("London, Baker Street, 20")
                        .web("telegram:@alexmiller, site:https://alexm.dev")
        );
    }
}
