package com.codebyte.api.item.mapper;

import static org.assertj.core.api.Assertions.assertThat;

import com.codebyte.api.item.api.dto.CreateItemRequest;
import com.codebyte.api.item.api.dto.ItemResponse;
import com.codebyte.api.item.api.dto.UpdateItemRequest;
import com.codebyte.api.item.domain.Item;
import java.util.UUID;
import org.junit.jupiter.api.Test;

class ItemMapperTest {

    private final ItemMapper mapper = new ItemMapperImpl();

    @Test
    void should_map_entity_to_response_including_audit_fields() {
        Item item = new Item("Widget", "desc");
        item.setId(UUID.randomUUID());
        item.setVersion(7L);

        ItemResponse response = mapper.toResponse(item);

        assertThat(response.id()).isEqualTo(item.getId());
        assertThat(response.name()).isEqualTo("Widget");
        assertThat(response.description()).isEqualTo("desc");
        assertThat(response.version()).isEqualTo(7L);
    }

    @Test
    void should_map_create_request_to_entity() {
        Item item = mapper.toEntity(new CreateItemRequest("Widget", "desc"));

        assertThat(item.getName()).isEqualTo("Widget");
        assertThat(item.getDescription()).isEqualTo("desc");
    }

    @Test
    void should_update_name_and_description_but_not_version() {
        Item item = new Item("Old", "old");
        item.setVersion(3L);

        mapper.updateEntity(new UpdateItemRequest("New", "new", 99L), item);

        assertThat(item.getName()).isEqualTo("New");
        assertThat(item.getDescription()).isEqualTo("new");
        assertThat(item.getVersion()).isEqualTo(3L); // version never mapped
    }
}
