package com.hpay.hpay_mobile_api.controllers;

import com.hpay.hpay_mobile_api.DTO.ErrorResponse;
import com.hpay.hpay_mobile_api.DTO.PaysDTO;
import com.hpay.hpay_mobile_api.DTO.SuccessResponse;
import com.hpay.hpay_mobile_api.entities.Pays;
import com.hpay.hpay_mobile_api.services.PayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/pays")
public class PayController {

    private final PayService payService;

    @Autowired
    public PayController(PayService payService) {
        this.payService = payService;
    }

    // Get all pays
    @GetMapping
    public ResponseEntity<List<Pays>> getAllPays() {
        List<Pays> pays = payService.getAllPays();
        return new ResponseEntity<>(pays, HttpStatus.OK);
    }

    @GetMapping("/search")
    public ResponseEntity<List<Pays>> getPaysByName(@RequestParam String pays) {
        List<Pays> paysList = payService.getPayByName(pays);

        if (paysList.isEmpty()) {
            return ResponseEntity.notFound().build(); // Retourne un 404 si aucun pays n'est trouvé
        } else {
            return ResponseEntity.ok(paysList); // Retourne une liste de pays
        }
    }

    // Get a pay by ID
    @GetMapping("/{id}")
    public ResponseEntity<Pays> getPayById(@PathVariable("id") Integer id) {
        Optional<Pays> pay = payService.getPayById(id);
        return pay.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
    }

    // Create a new pay
    @PostMapping
    public ResponseEntity<Pays> createPay(@RequestBody Pays pay) {
        Pays createdPay = payService.createPay(pay);
        return new ResponseEntity<>(createdPay, HttpStatus.CREATED);
    }

    // Update an existing pay
    @PutMapping("/{id}")
    public ResponseEntity<Pays> updatePay(@PathVariable("id") Integer id, @RequestBody Pays payDetails) {
        Pays updatedPay = payService.updatePay(id, payDetails);
        return new ResponseEntity<>(updatedPay, HttpStatus.OK);
    }

    // Delete a pay by ID
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deletePay(@PathVariable("id") Integer id) {
        payService.deletePay(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @GetMapping("/allwithnocity")
    public Object getPaysWithoutVilles() {

        Object response = payService.getAllPaysWithoutVilles();

        if (response instanceof SuccessResponse) {
            return ResponseEntity.status(201).body(response);  // User created successfully
        } else if (response instanceof ErrorResponse) {
            ErrorResponse errorResponse = (ErrorResponse) response;
            return ResponseEntity.status(errorResponse.getStatusCode()).body(errorResponse);  // Error response
        }
        return ResponseEntity.status(400).body(new ErrorResponse("Unknown error", 400)); // Default error response
    }


}