package com.saas.tenant.controller;

import com.saas.tenant.dto.request.CreateMedicalServiceRequest;
import com.saas.tenant.dto.request.UpdateMedicalServiceRequest;
import com.saas.tenant.dto.response.MedicalServiceResponse;
import com.saas.tenant.entity.ServiceType;
import com.saas.tenant.service.MedicalServiceService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/tenant/services")
@PreAuthorize("hasRole('TENANT_USER')")
@RequiredArgsConstructor
public class MedicalServiceController {

    private final MedicalServiceService medicalServiceService;

    @PostMapping
    public ResponseEntity<MedicalServiceResponse> createMedicalService(
            @Valid @RequestBody CreateMedicalServiceRequest request) {
        return ResponseEntity.status(HttpStatus.CREATED).body(medicalServiceService.createMedicalService(request));
    }

    @PutMapping("/{id}")
    public ResponseEntity<MedicalServiceResponse> updateMedicalService(
            @PathVariable Long id,
            @Valid @RequestBody UpdateMedicalServiceRequest request) {
        return ResponseEntity.ok(medicalServiceService.updateMedicalService(id, request));
    }

    @GetMapping("/{id}")
    public ResponseEntity<MedicalServiceResponse> getMedicalServiceById(@PathVariable Long id) {
        return ResponseEntity.ok(medicalServiceService.getMedicalServiceById(id));
    }

    @GetMapping
    public ResponseEntity<List<MedicalServiceResponse>> getAllMedicalServices() {
        return ResponseEntity.ok(medicalServiceService.getAllMedicalServices());
    }

    @GetMapping("/type/{type}")
    public ResponseEntity<List<MedicalServiceResponse>> getMedicalServicesByType(@PathVariable ServiceType type) {
        return ResponseEntity.ok(medicalServiceService.getMedicalServicesByType(type));
    }

    @GetMapping("/search/symptom")
    public ResponseEntity<List<MedicalServiceResponse>> searchBySymptom(@RequestParam String symptom) {
        return ResponseEntity.ok(medicalServiceService.searchBySymptom(symptom));
    }

    @GetMapping("/search/keyword")
    public ResponseEntity<List<MedicalServiceResponse>> searchByKeyword(@RequestParam String keyword) {
        return ResponseEntity.ok(medicalServiceService.searchByKeyword(keyword));
    }

    @GetMapping("/search")
    public ResponseEntity<List<MedicalServiceResponse>> search(@RequestParam String term) {
        return ResponseEntity.ok(medicalServiceService.searchByNameOrDescription(term));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteMedicalService(@PathVariable Long id) {
        medicalServiceService.deleteMedicalService(id);
        return ResponseEntity.noContent().build();
    }
}
