package ec.edu.espe.movilidad.MovilidadWS.Controller;

import ec.edu.espe.movilidad.MovilidadWS.Dto.DtoUzyTavConvoca;
import ec.edu.espe.movilidad.MovilidadWS.Service.UzyTavConvoca.IServiceUzyTavConvoca;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.NoSuchElementException;

import static ec.edu.espe.movilidad.MovilidadWS.Constant.GlobalConstants.V1_API_VERSION;

@RestController
@CrossOrigin(origins = "*")
@RequestMapping(V1_API_VERSION+"/convoca")
public class UzyTavConvocaController {


    private final IServiceUzyTavConvoca serviceUzyTavConvoca;

    @Autowired
    public UzyTavConvocaController(IServiceUzyTavConvoca serviceUzyTavConvoca) {
        this.serviceUzyTavConvoca = serviceUzyTavConvoca;
    }


    @PostMapping("/guardarnuevo")
    public ResponseEntity<DtoUzyTavConvoca> saveUzyTavConvoca(
            @RequestParam("file") MultipartFile file,
            @ModelAttribute DtoUzyTavConvoca dtoUzyTavConvoca) throws IOException {

        dtoUzyTavConvoca.setUzytavconvoca_digital(file);

        DtoUzyTavConvoca savedUzyTavConvoca = serviceUzyTavConvoca.save(dtoUzyTavConvoca);
        if (savedUzyTavConvoca != null) {
            return ResponseEntity.ok(savedUzyTavConvoca);
        } else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    @PutMapping("editar/{uzytavconvoca_id}")
    public ResponseEntity<DtoUzyTavConvoca> edit(
            @PathVariable("uzytavconvoca_id") Long uzytavconvocaId,
            @ModelAttribute DtoUzyTavConvoca dtoUzyTavConvoca) {
        try {
            DtoUzyTavConvoca updatedUzyTavConvoca = serviceUzyTavConvoca.edit(uzytavconvocaId, dtoUzyTavConvoca);
            return ResponseEntity.ok(updatedUzyTavConvoca);
        } catch (NoSuchElementException e) {
            // Manejar la excepción en caso de no encontrar el objeto a editar
            return ResponseEntity.notFound().build();
        } catch (IllegalArgumentException e) {
            // Manejar la excepción en caso de parámetros incorrectos
            return ResponseEntity.badRequest().build();
        } catch (IOException e) {
            // Manejar la excepción en caso de error al guardar el archivo
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    @GetMapping("/exampleFindId/{id}")
    public ResponseEntity<DtoUzyTavConvoca> listarPorID(@PathVariable("id") Long id) {
        DtoUzyTavConvoca dto = serviceUzyTavConvoca.ListarPorID(id);
        if (dto != null) {
            return ResponseEntity.ok(dto);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @GetMapping("/getAll")
    public ResponseEntity<List<DtoUzyTavConvoca>> listarRegistros() {
        List<DtoUzyTavConvoca> dtos = serviceUzyTavConvoca.ListarRegistros();
        return ResponseEntity.ok(dtos);
    }


    @DeleteMapping("/eliminar/{id}")
    public ResponseEntity<Void> eliminar(@PathVariable Long id) {
        serviceUzyTavConvoca.eliminar(id);
        return ResponseEntity.ok().build();
    }

    @DeleteMapping("/eliminarConPDF/{uzytavconvoca_id}")
    public ResponseEntity<String> eliminarConPDF(@PathVariable("uzytavconvoca_id") Long uzytavconvocaId) {
        try {
            serviceUzyTavConvoca.eliminarConPDF(uzytavconvocaId);
            return ResponseEntity.ok("Registro eliminado exitosamente.");
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("Error al eliminar el registro: " + e.getMessage());
        }
    }

    @GetMapping("/verPDF/{id}")
    public ResponseEntity<byte[]> obtenerContenidoPDF(@PathVariable("id") Long convocaId) {
        String fileName = serviceUzyTavConvoca.obtenerNombrePDF(convocaId);
        byte[] pdfContent = serviceUzyTavConvoca.obtenerContenidoPDF(convocaId);
        if (pdfContent != null && fileName != null) {

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_PDF);
            headers.setContentDisposition(ContentDisposition.builder("inline").filename(fileName).build());
            return new ResponseEntity<>(pdfContent, headers, HttpStatus.OK);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

}