package kz.konturai.parser.controller;

import kz.konturai.parser.dto.ApiResponse;
import kz.konturai.parser.dto.ParserStatsDto;
import kz.konturai.parser.model.MarketItem;
import kz.konturai.parser.service.MarketItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * Контроллер для публичных запросов на получение данных.
 * Содержит эндпоинты, которые нужны фронтенду для отображения данных.
 */
@RestController
@RequestMapping("/api/parser/items")
public class MarketItemController {

    @Autowired
    private MarketItemService marketItemService;

    /**
     * Получение записей с фильтрацией и пагинацией
     */
    @GetMapping
    public ResponseEntity<ApiResponse<Page<MarketItem>>> getItems(
            @RequestParam(required = false) String sourceName,
            @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) String startDate,
            @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) String endDate,
            @PageableDefault(size = 20, sort = "publishedAt", direction = org.springframework.data.domain.Sort.Direction.DESC) Pageable pageable) {

        try {
            LocalDateTime start = marketItemService.parseDate(startDate);
            LocalDateTime end = marketItemService.parseDate(endDate);

            Page<MarketItem> items;

            if (sourceName != null || start != null || end != null) {
                // Используем фильтрацию
                items = marketItemService.getItemsWithFilters(sourceName, start, end, pageable);
            } else {
                // Получаем все записи
                items = marketItemService.getAllItems(pageable);
            }

            return ResponseEntity.ok(ApiResponse.success("Записи получены успешно", items));

        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                    .body(ApiResponse.error("Ошибка при получении записей: " + e.getMessage()));
        }
    }

    /**
     * Получение записи по ID
     */
    @GetMapping("/{id}")
    public ResponseEntity<ApiResponse<MarketItem>> getItemById(@PathVariable String id) {
        try {
            // Здесь можно добавить метод для поиска по ID в сервисе
            return ResponseEntity.ok(ApiResponse.error("Функция поиска по ID пока не реализована"));

        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                    .body(ApiResponse.error("Ошибка при получении записи: " + e.getMessage()));
        }
    }

    /**
     * Получение статистики по сохраненным записям
     */
    @GetMapping("/stats")
    public ResponseEntity<ApiResponse<ParserStatsDto>> getStats() {
        try {
            long totalCount = marketItemService.getTotalItemsCount();
            var sourceStatistics = marketItemService.getSourceStatistics();
            String lastUpdate = java.time.LocalDateTime.now().toString();

            ParserStatsDto stats = new ParserStatsDto(totalCount, sourceStatistics, lastUpdate);

            return ResponseEntity.ok(ApiResponse.success("Статистика получена успешно", stats));

        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                    .body(ApiResponse.error("Ошибка при получении статистики: " + e.getMessage()));
        }
    }

    /**
     * Получение всех уникальных источников
     */
    @GetMapping("/sources")
    public ResponseEntity<ApiResponse<java.util.List<String>>> getSources() {
        try {
            java.util.List<String> sources = marketItemService.getAllSourceNames();
            return ResponseEntity.ok(ApiResponse.success("Источники получены успешно", sources));

        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                    .body(ApiResponse.error("Ошибка при получении источников: " + e.getMessage()));
        }
    }

    /**
     * Получение записей по конкретному источнику
     */
    @GetMapping("/source/{sourceName}")
    public ResponseEntity<ApiResponse<Page<MarketItem>>> getItemsBySource(
            @PathVariable String sourceName,
            @PageableDefault(size = 20, sort = "publishedAt", direction = org.springframework.data.domain.Sort.Direction.DESC) Pageable pageable) {
        try {
            Page<MarketItem> items = marketItemService.getItemsBySource(sourceName, pageable);
            return ResponseEntity
                    .ok(ApiResponse.success("Записи по источнику " + sourceName + " получены успешно", items));

        } catch (Exception e) {
            return ResponseEntity.internalServerError()
                    .body(ApiResponse.error("Ошибка при получении записей по источнику: " + e.getMessage()));
        }
    }
}
