package es.uv.saic.web;

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

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

import es.uv.saic.domain.IndicadorEnquesta;
import es.uv.saic.domain.Organ;
import es.uv.saic.dto.OrganDTO;
import es.uv.saic.dto.OrganTransferDTO;
import es.uv.saic.service.IndicadorEnquestaService;
import es.uv.saic.service.OrganService;

@RestController
public class OrganController {
    
    @Autowired
    private OrganService os;

    @Autowired
    private IndicadorEnquestaService ies;

    /*
     * Endpoint for getTitulacions
     */
    @GetMapping("/getTitulacionsWithCentre")
    public List<OrganDTO> getTitulacionsWithCentre() {
        return os.findAllTitulacionsWithCentre();
    }

    /*
     * Endopint for findByRuct
     */
    @GetMapping("/getAllIndsByRuct/{ruct}/{curs}")
    public List<IndicadorEnquesta> getAllIndsByRuct(@PathVariable Integer ruct, @PathVariable Integer curs) {
        Organ o = os.findByRuct(ruct); 
        return ies.getAllInds(o, curs);
    }

    @GetMapping("/getOrgByRuct/{ruct}")
    public OrganDTO getOrgByRuct(@PathVariable Integer ruct) {
        return os.findByRuctDTO(ruct);
    }

    /*
     * Endpoint para findById
     */
    @GetMapping("/findById/{tlugar}/{idTitulacio}")
    public ResponseEntity<?> findById(@PathVariable String tlugar,  @PathVariable Integer idTitulacio) {
        try {
            Organ organ = os.findByID(tlugar, idTitulacio);
            OrganTransferDTO organTransferDTO = new OrganTransferDTO(organ);

            return ResponseEntity.ok(organTransferDTO);
        } catch(Exception e) {
            return ResponseEntity.badRequest().body("Error al obtener el organo" +
                " por tlugar y titulación: " + e.getMessage());
        }
    }

    /*
     * Endpoint para getTitulacionsByTypeCentre
     */
    @GetMapping("/getTitulacionsByTypeCentre/{lugar}/{ambit}")
    public ResponseEntity<?> getTitulacionsByTypeCentre(@PathVariable Integer lugar, @PathVariable Integer ambit) {
        try {
            List<Organ> organList = os.getTitulacionsByTypeCentre(lugar, ambit);
            List<OrganTransferDTO> organDTOList = new ArrayList<>();
            
            for(Organ org: organList) {
                organDTOList.add(new OrganTransferDTO(org));
            }

            return ResponseEntity.ok(organDTOList);
        } catch(Exception e) {
            return ResponseEntity.badRequest().body("Error al obtener los organos" +
                " por lugar y ambit: " + e.getMessage());
        }
    }

    @GetMapping("/existsOrg/{tlugar}/{idTitulacio}")
    public boolean existsOrg(@PathVariable String tlugar,  @PathVariable Integer idTitulacio) {
        return os.exists(tlugar, idTitulacio);
    }

    @GetMapping("/getTitulacionsByCentreTambit/{centre}/{tambit}")
    public ResponseEntity<?> getTitulacionsByCentreTambit(@PathVariable Integer lugar, @PathVariable String tambit) {
        try {
            List<Organ> organList = os.findActiveTitulacionsByCentreTambit(lugar, tambit);
            List<OrganTransferDTO> organDTOList = new ArrayList<>();

            for(Organ org: organList) {
                organDTOList.add(new OrganTransferDTO(org));
            }

            return ResponseEntity.ok(organDTOList);
        } catch(Exception e) {
            return ResponseEntity.badRequest().body("Error al obtener los organos" +
                " por lugar y ambit: " + e.getMessage());
        }
    }
}
