package at.tuwien;

import at.tuwien.api.zenodo.deposit.*;
import at.tuwien.api.zenodo.files.FileResponseDto;
import at.tuwien.api.zenodo.files.FileLinksDto;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.test.context.TestPropertySource;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;

@TestPropertySource(locations = "classpath:application.properties")
public abstract class BaseUnitTest {

    public final static Long DEPOSIT_1_ID = 1L;
    public final static String DEPOSIT_1_TITLE = "Super cool document";
    public final static String DEPOSIT_1_DESCRIPTION = "My document is the best";
    public final static Instant DEPOSIT_1_CREATED = Instant.now().minus(1, ChronoUnit.HOURS);
    public final static Instant DEPOSIT_1_MODIFIED = Instant.now();
    public final static String DEPOSIT_1_STATE = "unsubmitted";
    public final static Boolean DEPOSIT_1_SUBMITTED = false;
    public final static Long DEPOSIT_1_RECORD_ID = 1899L;
    public final static LicenseTypeDto DEPOSIT_1_LICENSE = LicenseTypeDto.BSD;
    public final static Long DEPOSIT_1_CONCEPT_RECORD_ID = 143L;
    public final static Long DEPOSIT_1_OWNER = 144L;

    public final static String METADATA_1_TITLE = "My super dataset";
    public final static UploadTypeDto METADATA_1_UPLOAD_TYPE = UploadTypeDto.DATASET;
    public final static String METADATA_1_DESCRIPTION = "The dataset contains 1000 records of ...";

    public final static String CREATOR_1_NAME = "First1 Last1";
    public final static String CREATOR_1_AFFIL = "TU Wien";
    public final static String CREATOR_1_ORCID = "0000-0002-5713-0725";

    public final static String CREATOR_2_NAME = "First2 Last2";
    public final static String CREATOR_2_AFFIL = "TU Graz";
    public final static String CREATOR_2_ORCID = "0000-0002-2606-4059";

    public final static String FILE_1_ID = "deadbeef-deafdeed";
    public final static String FILE_1_NAME = "testdata-othername.csv";
    public final static String FILE_1_CHECKSUM = "d393c7fa1240c18473133793f7901aaa";
    public final static Long FILE_1_SIZE = 34614L;

    public final static Long DEPOSIT_2_ID = 2L;
    public final static String DEPOSIT_2_TITLE = "Test Document " + RandomStringUtils.randomAlphanumeric(10);
    public final static String DEPOSIT_2_DESCRIPTION = "Test Description " + RandomStringUtils.randomAlphanumeric(100);
    public final static Instant DEPOSIT_2_CREATED = Instant.now().minus(2, ChronoUnit.HOURS);
    public final static Instant DEPOSIT_2_MODIFIED = Instant.now();
    public final static LicenseTypeDto DEPOSIT_2_LICENSE = LicenseTypeDto.CC_BY;
    public final static String DEPOSIT_2_STATE = "draft";
    public final static Boolean DEPOSIT_2_SUBMITTED = false;

    public final static String FILE_1_LINKS_DOWNLOAD = "http://localhost:5500/file/" + FILE_1_ID + "/download";
    public final static String FILE_1_LINKS_SELF = "http://localhost:5500/file/" + FILE_1_ID;

    public final static String DEPOSIT_1_DOI = "10.5072/zenodo.542201";
    public final static Long DEPOSIT_1_REC_ID = 542201L;

    public final static CreatorDto CREATOR_1 = CreatorDto.builder()
            .name(CREATOR_1_NAME)
            .affiliation(CREATOR_1_AFFIL)
            .orcid(CREATOR_1_ORCID)
            .build();

    public final static CreatorDto CREATOR_2 = CreatorDto.builder()
            .name(CREATOR_2_NAME)
            .affiliation(CREATOR_2_AFFIL)
            .orcid(CREATOR_2_ORCID)
            .build();

    public final static MetadataDto METADATA_1 = MetadataDto.builder()
            .creators(new CreatorDto[]{CREATOR_1, CREATOR_2})
            .description(METADATA_1_DESCRIPTION)
            .title(METADATA_1_TITLE)
            .uploadType(METADATA_1_UPLOAD_TYPE)
            .build();

    public final static FileLinksDto FILE_1_LINKS = FileLinksDto.builder()
            .download(FILE_1_LINKS_DOWNLOAD)
            .self(FILE_1_LINKS_SELF)
            .build();

    public final static FileResponseDto FILE_1 = FileResponseDto.builder()
            .checksum(FILE_1_CHECKSUM)
            .filename(FILE_1_NAME)
            .id(FILE_1_ID)
            .filesize(FILE_1_SIZE)
            .links(FILE_1_LINKS)
            .build();

    public final static DepositChangeResponseDto DEPOSIT_1 = DepositChangeResponseDto.builder()
            .id(DEPOSIT_1_ID)
            .created(DEPOSIT_1_CREATED)
            .modified(DEPOSIT_1_MODIFIED)
            .title(DEPOSIT_1_TITLE)
            .state(DEPOSIT_1_STATE)
            .submitted(DEPOSIT_1_SUBMITTED)
            .recordId(DEPOSIT_1_RECORD_ID)
            .files(List.of(FILE_1))
            .build();

    public final static DepositResponseDto DEPOSIT_2 = DepositResponseDto.builder()
            .id(DEPOSIT_1_ID)
            .title(DEPOSIT_1_TITLE)
            .state(DEPOSIT_1_STATE)
            .submitted(DEPOSIT_1_SUBMITTED)
            .recordId(DEPOSIT_1_RECORD_ID)
            .files(List.of(FILE_1))
            .build();

}