package pl.hackerspace;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import pl.hackerspace.domain.Client;
import pl.hackerspace.domain.Invoice;
import pl.hackerspace.repository.ClientRepository;
import pl.hackerspace.repository.InvoiceRepository;

import java.math.BigDecimal;
import java.time.LocalDateTime;

@Component
@Slf4j
@RequiredArgsConstructor
public class BoostrapInitialData implements CommandLineRunner {

    private final ClientRepository clientRepository;
    private final InvoiceRepository invoiceRepository;

    @Override
    public void run(String... args) {
        log.info("Saving new clients");
        Client client = Client.builder()
                .price(BigDecimal.valueOf(200))
                .nip("PL5252497215")
                .name("Arseniy Sorokin")
                .addressLine1("ul. Bródnowska 3/23")
                .addressLine2("03-439 Warszawa, Polska")
                .serviceName("Dostęp do Internetu - Umowa HSWAW/666 - Opłata abonamentowa %invoice_month_string%")
                .email("arssorokin@gmail.com")
                .build();
        clientRepository.save(client);
        clientRepository.save(Client.builder()
                .price(BigDecimal.valueOf(100))
                .nip("PL111")
                .name("Pope Francis")
                .addressLine1("St.Peter's square")
                .addressLine2("Rome")
                .serviceName("Dostęp do Internetu - Umowa HSWAW/2137 - Opłata abonamentowa %invoice_month_string%")
                .email("pope@vatican.va")
                .build());
        log.info("Saving last invoice");
        invoiceRepository.save(Invoice.builder().id(21196).invoiceTitle("FV21196").creationDate(LocalDateTime.now())
                .client(client).pdfContent(new byte[]{}).build());
    }
}
