package es.uv.saic.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.databind.JsonMappingException;

import es.uv.saic.domain.Organ;
import es.uv.saic.service.IndicadorService;
import es.uv.saic.domain.Indicador;
import es.uv.saic.domain.IndicadorEnquesta;
import es.uv.saic.domain.IndicadorEnquestaTmp;
import es.uv.saic.dto.EnquestaDTO;
import es.uv.saic.dto.IndicadorEnquestaDTO;
import es.uv.saic.dto.IndicadorEnquestaTmpDup;
import es.uv.saic.dto.IndicadorEnquestaValorDTO;
import es.uv.saic.service.IndicadorEnquestaService;
import es.uv.saic.service.IndicadorEnquestaTmpService;

@RestController
public class IndicadorController {
    @Autowired
    private IndicadorService is;

    @Autowired
    private IndicadorEnquestaService ies;

    @Autowired
    private IndicadorEnquestaTmpService iets;

    @Autowired
    private es.uv.saic.service.OrganService os;

    /*
    * Endpoint para la funcion deleteByEnquestaCursAmbitEstudi de iets
    */
    @DeleteMapping("/delete/ByEnquestaCursAmbitEstudi")
    public Integer deleteByEnquestaCursAmbitEstudi(@RequestBody EnquestaDTO enquestaDTO) {

        Integer i = 0;
        try {
            i = iets.deleteByEnquestaCursAmbitEstudi(enquestaDTO.getEnquesta(), enquestaDTO.getCurs(),
                enquestaDTO.getAmbit(), enquestaDTO.getEstudi());

        } catch(Exception e) {
            e.printStackTrace();
        }
    return i;
    }

    @DeleteMapping("/delete/by/{enquesta}")
    public Integer deleteByEnquestaC(@PathVariable String enquesta) {
        return iets.deleteByEnquesta(enquesta);
    }

    /*
    * Endpoint para la funcion deleteFromCurrent de iets, dev
    */
    @DeleteMapping("/delete/current/{enquesta}")
    public Integer deleteFromCurrent(@PathVariable("enquesta") String enquesta) {
        return iets.deleteFromCurrent(enquesta);
    }

    /*
    * Endpoint para la funcion deleteFromPending de iets
    */
    @DeleteMapping("/delete/pending/{enquesta}")
    public Integer deleteFromPending(@PathVariable("enquesta") String enquesta) {
        return iets.deleteFromPending(enquesta);
    }

    /*
    * Endpoint para la funcion deleteDuplicates de iets
    */
    @DeleteMapping("/delete/duplicates/{enquesta}")
    public Integer deleteDuplicates(@PathVariable("enquesta") String enquesta) {
       return iets.deleteDuplicates(enquesta);
    }

    /*
     * Endpoint1 para la funcion getAllInds de ies
     */
    @GetMapping("/allInds/{ruct}/{curs}")
    public ResponseEntity<?> getAllInds(@PathVariable Integer ruct, @PathVariable Integer curs) {
        try {
            
            Organ organ = os.findByRuct(ruct);
            List<IndicadorEnquesta> list = ies.getAllInds(organ, curs);

            return ResponseEntity.ok(list);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body("Error al obtener los indicadores1: " + e.getMessage());
        }
    }

    /*
     * Endpoint2 para la funcion getAllInds de ies
     */
    @PostMapping("/allInds2")
    public ResponseEntity<?> getAllInds2(@RequestBody IndicadorEnquestaDTO indicadorEnquestaDTO) {
        try {
            List<IndicadorEnquestaValorDTO> list = ies.getAllInds(indicadorEnquestaDTO.getIdTitulacio(),
                indicadorEnquestaDTO.getIdCentre(), indicadorEnquestaDTO.getCurs());

            return ResponseEntity.ok(list);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body("Error al obtener los indicadores2: " + e.getMessage());
        }
    }

    /*
     * Endpoint para la funcion findByEnquestaCursAmbitEstudi de ies
     */
    @PostMapping("/findByEnquestaCursAmbitEstudi")
    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudi(@RequestBody EnquestaDTO enquestaDTO) {
        return ies.findByEnquestaCursAmbitEstudi(enquestaDTO.getEnquesta(),
                enquestaDTO.getCurs(), enquestaDTO.getAmbit(), enquestaDTO.getEstudi());
    }

    /*
     * Endpoing para la función findByEnquestaCursAmbitEstudiCentre
     */
    @PostMapping("/findByEnquestaCursAmbitEstudiCentre")
    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentre(@RequestBody EnquestaDTO enquestaDTO) {
        return ies.findByEnquestaCursAmbitEstudiCentre(enquestaDTO.getEnquesta(),
                enquestaDTO.getCurs(), enquestaDTO.getAmbit(), enquestaDTO.getEstudi(), enquestaDTO.getCentre());
    }

    @PostMapping("/findByEnquestaCursAmbitEstudiCentreTitulacio")
    public List<IndicadorEnquesta> findByEnquestaCursAmbitEstudiCentreTitulacio(@RequestBody EnquestaDTO enquestaDTO) {
        return ies.findByEnquestaCursAmbitEstudiCentreTitulacio(enquestaDTO.getEnquesta(),
                enquestaDTO.getCurs(), enquestaDTO.getAmbit(), enquestaDTO.getEstudi(), enquestaDTO.getCentre(),
                enquestaDTO.getTitulacio());
    }

    /*
     * Endpoint para la funcion getFromTitulacion de ies
     */
    @GetMapping("/getFromTitulacio/{idTitulacio}/{curs}")
    public ResponseEntity<?> getFromTitulacion(@PathVariable Integer idTitulacio, @PathVariable Integer curs) {
        try {
            List<Indicador> list = is.getFromTitulacion(idTitulacio, curs);

            return ResponseEntity.ok(list);
        } catch (JsonMappingException e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body("Error al mapear el JSON: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body("Error al obtener los indicadores: " + e.getMessage());
        }
    }

    /*
     * Endpoint para la funcion save de iets
     */
    @PostMapping("/save")
    public void save(@RequestBody IndicadorEnquestaTmp ie) {
        iets.save(ie);
    }

    @GetMapping("/countByEnquesta/{enquesta}")
    public Integer countByEnquesta(@RequestParam String enquesta) {
        return iets.countByEnquesta(enquesta);
    }
    
    @GetMapping("/checkDuplicates/{enquesta}")
    public List<IndicadorEnquestaTmpDup> checkDuplicates(@PathVariable String enquesta) {
        return iets.checkDuplicates(enquesta);
    }
    
    @GetMapping("/checkIntegrity/{enquesta}")
    public List<IndicadorEnquestaTmpDup> checkIntegrity(@PathVariable String enquesta) {
        return iets.checkDuplicates(enquesta);
    }

    @GetMapping("/consolidateByEnquesta/{enquesta}")
    public Integer consolidateByEnquesta(@PathVariable String enquesta) {
        return ies.consolidateByEnquesta(enquesta);
    }
    
}
