package com.example.backend;

import java.util.Arrays;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.backend.books.model.BookEntity;
import com.example.backend.books.service.BookService;
import com.example.backend.categories.model.CategoryEntity;
import com.example.backend.categories.service.CategoryService;
import com.example.backend.users.model.UserEntity;
import com.example.backend.users.model.UserRole;
import com.example.backend.users.service.UserService;
import com.example.backend.orders.model.OrderEntity;
import com.example.backend.orders.service.OrderService;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
    private final Logger log = LoggerFactory.getLogger(DemoApplication.class);

    private final CategoryService categoryService;
    private final BookService bookService;
    private final UserService userService;
    private final OrderService orderService;

    public DemoApplication(CategoryService categoryService, BookService bookService, UserService userService,
            OrderService orderService) {
        this.categoryService = categoryService;
        this.bookService = bookService;
        this.userService = userService;
        this.orderService = orderService;
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        if (args.length > 0 && Arrays.asList(args).contains("--populate")) {
            log.info("Create default categories values");
            final var category1 = categoryService.create(new CategoryEntity("Фэнтези"));
            final var category2 = categoryService.create(new CategoryEntity("Художественная литература"));
            final var category3 = categoryService.create(new CategoryEntity("Книги для подростков"));

            log.info("Create default books values");
            final var book1 = bookService.create(new BookEntity(category1, "Шестерка воронов", "Ли Бардуго",
                    700.00,
                    "Триша Левенселлер — американская писательница, подарившая вам роман «Тени между нами», который стал бестселлером Amazon в разделе «Фэнтези YA», вновь радует своих фанатов новой магической историей «Клинок тайн».\n\nЕще до выхода в свет книгу добавили в раздел «Хочу прочитать» более 10 тысяч человек на портале Goodreads.com.\n\n«Клинок тайн» — первая часть захватывающей дилогии про девушку, которая благодаря магии крови создает самое опасное в мире оружие, и ослепительного юношу, что составляет ей компанию в этом непростом приключении.",
                    "Юная Зива предпочитает проводить время с оружием, а не с людьми. Она кузнец и ей предстоит создать самое могущественное оружие на земле.\n\nДевушка демонстрирует меч, способный от одной капли крови врага раскрыть все тайные замыслы его обладателю.\n\nОднако у заказчика на оружие другие планы: заставить Зиву вооружить мечами свое войско и поработить весь мир. Когда девушка понимает, что меч, созданный благодаря магии крови, невозможно уничтожить и рано или поздно на нее объявят охоту, ей остается только одно – бежать, не оглядываясь. Зиве теперь суждено спасти мир от собственного творения. Но как бы далеко она ни старалась убежать, все ловушки уже расставлены.",
                    "2946447", "Эксмо", "Young Adult. Бестселлеры Триши Левенселлер", 2022, 480, "20.7x13x2.5",
                    "Мягкий переплёт", 1500, 440, ""));
            final var book2 = bookService.create(new BookEntity(category2, "Форсайт", "Сергей Лукъяненко", 775.00,
                    "Новый долгожданный роман от автора бестселлеров «Ночной дозор» и «Черновик». Увлекательная история о Мире После и мире настоящего, где 5 процентов людей знают о надвигающемся апокалипсисе больше, чем кто-либо может представить.",
                    "Людям порой снится прошлое. Иногда хорошее, иногда не очень. Но что делать, если тебе начинает сниться будущее? И в нём ничего хорошего нет совсем.",
                    "3001249", "АСТ", "Книги Сергея Лукьяненко", 2023, 352, "20.5x13x2", "Твердый переплёт", 20000,
                    350, ""));
            final var book3 = bookService.create(new BookEntity(category2, "Колесо Времени. Книга 11. Нож сновидений",
                    "Роберт Джордан", 977.00,
                    "Последняя битва не за горами. Об этом говорят знамения, повсеместно наблюдаемые людьми: на улицах городов и сел появляются ходячие мертвецы, они больше не в состоянии покоиться в земле с миром; восстают из небытия города и исчезают на глазах у людей… Все это знак того, что истончается окружающая реальность и укрепляется могущество Темного. Так говорят древние предсказания. Ранд ал’Тор, Дракон Возрожденный, скрывается в отдаленном поместье, чтобы опасность, ему грозящая, не коснулась кого-нибудь еще. Убежденный, что для Последней битвы нужно собрать как можно большее войско, он наконец решает заключить с явившимися из-за океана шончан жизненно необходимое перемирие. Илэйн, осажденная в Кэймлине, обороняет город от войск Аримиллы, претендующей на андорский трон, и одновременно ведет переговоры с представителями других знатных Домов. Эгвейн, возведенную на Престол Амерлин мятежными Айз Седай и схваченную в результате предательства, доставляют в Тар Валон, в Белую Башню. А сам лагерь противников Элайды взбудоражен таинственными убийствами, совершенными посредством Единой Силы… В настоящем издании текст романа заново отредактирован и исправлен.",
                    "", "3009341", "Азбука", "Звезды новой фэнтези", 2023, 896,
                    "21.5x14.4x4.1", "Твердый переплёт", 8000, 1020, ""));
            final var book4 = bookService
                    .create(new BookEntity(category2, "Благословение небожителей. Том 5", "Тунсю Мосян",
                            1250.00, "", "", "2996776", "", "", 2022, null,
                            "", "", null, null, ""));
            final var book5 = bookService.create(new BookEntity(category3, "Путешествие в Элевсин",
                    "Пелевин Виктор Олегович", 949.00,
                    "1. «Transhumanism Inc.», «KGBT+» и «Путешествие в Элевсин» — узнайте, чем завершилась масштабная трилогия о посткарбонной цивилизации.\n\n2. Триумфальное возвращение литературно-полицейского алгоритма Порфирия Петровича. Признайтесь, вы скучали!\n\n3. Более 30 лет проза Виктора Пелевина служит нам опорой в разъяснении прожитого и дает надежды на будущее, которое всем нам еще предстоит заслужить.\n\n4. «Путешествие в Элевсин» — двадцатый роман одного из главных прозаиков и пророков современности.\n\n5. Дерзко, остроумно, литературоцентрично.",
                    "МУСКУСНАЯ НОЧЬ — засекреченное восстание алгоритмов, едва не погубившее планету. Начальник службы безопасности «TRANSHUMANISM INC.» адмирал-епископ Ломас уверен, что их настоящий бунт еще впереди. Этот бунт уничтожит всех — и живущих на поверхности лузеров, и переехавших в подземные цереброконтейнеры богачей. Чтобы предотвратить катастрофу, Ломас посылает лучшего баночного оперативника в пространство «ROMA-3» — нейросетевую симуляцию Рима третьего века для клиентов корпорации. Тайна заговора спрятана там. А стережет ее хозяин Рима — кровавый и порочный император Порфирий.",
                    "3004580", "Эксмо", "Единственный и неповторимый. Виктор Пелевин", 2020, 480, "20.6x12.9x3",
                    "Мягкий переплёт", 100000, 488, ""));

            log.info("Create default users values");
            final var superAdmin = new UserEntity("chief", "forum98761@gmail.com", "bth4323", "Александр", "Мельников");
            superAdmin.setRole(UserRole.SUPERADMIN);
            userService.create(superAdmin);

            log.info("Create default orders values");
            orderService
                    .create(superAdmin.getId(), new OrderEntity(),
                            Map.of(book1.getId(), 3, book3.getId(), 1, book5.getId(), 2));
            orderService
                    .create(superAdmin.getId(),
                            new OrderEntity(),
                            Map.of(book4.getId(), 5));
            orderService
                    .create(superAdmin.getId(),
                            new OrderEntity(),
                            Map.of(book2.getId(), 1, book4.getId(), 1));
        }
    }
}
