package com.healthcare.ohctech.service.impl;

import com.healthcare.ohctech.dto.FirstAidBoxDto;
import com.healthcare.ohctech.entity.FirstAidBox;
import com.healthcare.ohctech.entity.Patient;
import com.healthcare.ohctech.repository.FirstAidBoxRepo;
import com.healthcare.ohctech.repository.PatientRepo;
import com.healthcare.ohctech.service.FirstAidBoxService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class FirstAidBoxServiceImpl implements FirstAidBoxService {

    private final FirstAidBoxRepo firstAidBoxRepo;
    private final PatientRepo patientRepo;

    @Autowired
    public FirstAidBoxServiceImpl(FirstAidBoxRepo firstAidBoxRepo, PatientRepo patientRepo) {
        this.firstAidBoxRepo = firstAidBoxRepo;
        this.patientRepo = patientRepo;
    }

    @Override
    public FirstAidBox getFirstAidBoxById(Long boxId) {
        return firstAidBoxRepo.findById(boxId)
                .orElseThrow(() -> new RuntimeException("First Aid Box not found with ID: " + boxId));
    }

    @Override
    public Page<FirstAidBox> getAllFirstAidBoxes(Pageable pageable) {
        return firstAidBoxRepo.findAll(pageable);
    }

    @Override
    public void addFirstAidBox(FirstAidBoxDto firstAidBoxDto, Long userId) {
        validateFirstAiderIds(firstAidBoxDto.firstAiderIds());
        FirstAidBox firstAidBox = convertToEntity(new FirstAidBox(), firstAidBoxDto);
        firstAidBox.setModifiedBy(userId);
        firstAidBoxRepo.save(firstAidBox);
    }

    @Override
    public void updateFirstAidBox(FirstAidBoxDto firstAidBoxDto, Long userId) {
        validateFirstAiderIds(firstAidBoxDto.firstAiderIds());
        Long boxId = firstAidBoxDto.id();
        FirstAidBox existingFirstAidBox = firstAidBoxRepo.findById(boxId)
                .orElseThrow(() -> new RuntimeException("First Aid Box not found with ID: " + boxId));

        FirstAidBox updatedFirstAidBox = convertToEntity(existingFirstAidBox, firstAidBoxDto);
        updatedFirstAidBox.setModifiedBy(userId);
        firstAidBoxRepo.save(updatedFirstAidBox);
    }

    @Override
    public void deleteFirstAidBox(Long boxId) {
        FirstAidBox firstAidBox = firstAidBoxRepo.findById(boxId)
                .orElseThrow(() -> new RuntimeException("First Aid Box not found with ID: " + boxId));
        firstAidBoxRepo.delete(firstAidBox);
    }

    private void validateFirstAiderIds(List<Long> firstAiderIds) {
        if (firstAiderIds != null) {
            for (Long firstAiderId : firstAiderIds) {
                if (!patientRepo.existsById(firstAiderId)) {
                    throw new RuntimeException("Patient not found for ID: " + firstAiderId);
                }
            }
        }
    }

    private FirstAidBox convertToEntity(FirstAidBox firstAidBox, FirstAidBoxDto firstAidBoxDto) {
        firstAidBox.setBoxName(firstAidBoxDto.boxName());
        firstAidBox.setBoxCode(firstAidBoxDto.boxCode());
        firstAidBox.setBoxLoc(firstAidBoxDto.boxLoc());

        if (firstAidBoxDto.firstAiderIds() != null) {
            String firstAiderIds = firstAidBoxDto.firstAiderIds().stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));
            firstAidBox.setFirstAiderIds(firstAiderIds);
        } else {
            firstAidBox.setFirstAiderIds("");
        }

        return firstAidBox;
    }
}