package com.sc.sicanet.migracion_sicanet.controller;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import com.sc.sicanet.migracion_sicanet.DTO.PersonaDTO;
import com.sc.sicanet.migracion_sicanet.entity.Persona;
import com.sc.sicanet.migracion_sicanet.response.*;
import com.sc.sicanet.migracion_sicanet.service.*;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/personas")
public class MigracionController {

    final private MigracionService migracionService;
    final private Validaciones validaciones;

    public MigracionController(MigracionService migracionService,  Validaciones validaciones) {
        this.migracionService = migracionService;
        this.validaciones = validaciones;
    }

    @GetMapping(produces = "application/json")
    public ResponseEntity<List<Persona>> findAll() {
        List<Persona> allPersonas = migracionService.findAll();
        return new ResponseEntity<>(allPersonas, HttpStatus.OK);
    }

    @GetMapping(path="/{id}", produces = "application/json")
    public ResponseEntity<Persona> findById(@PathVariable("id") int id){
        Optional<Persona> persona = migracionService.findById(id);
        return persona.map(value -> new ResponseEntity<>(value, HttpStatus.OK)).orElseGet(() -> ResponseEntity.notFound().build());
    }

    @Autowired
    private PersonaService personaService;

    @PostMapping()
    public ResponseEntity<?> migrateData(@Valid @RequestBody() PersonaDTO personaDTO, Errors errors) {
        validaciones.validate(personaDTO, errors);

        List<ErrorResponse> errores = ErrorResponse.validateError(errors);
        if(!errores.isEmpty())
            return ResponseEntity.badRequest().body(new StandardResponse(400, "Errores de validación", errores));

        Map<String, String> resultadoMigracion = migracionService.migracion(personaDTO);
        return ResponseEntity.ok(new StandardResponse(
            Integer.parseInt(resultadoMigracion.get("code")),
            resultadoMigracion.get("mensaje"),
            resultadoMigracion.get("referenciaAcreditado"),
            resultadoMigracion.get("nombreAcreditado"),
            resultadoMigracion.get("uuidDomicilioPersonal"),
            resultadoMigracion.get("uuidDomicilioLaboral")));
    }
}