package com.hepl.tunefortwo.controller;

import java.util.List;

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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.hepl.tunefortwo.config.i18n.Translator;
import com.hepl.tunefortwo.dto.AccessControlStatus;
import com.hepl.tunefortwo.dto.GenericData;
import com.hepl.tunefortwo.dto.GenericResponse;
import com.hepl.tunefortwo.dto.InstrumentRequestDto;
import com.hepl.tunefortwo.service.MoodService;
import com.hepl.tunefortwo.utils.AppMessages;
import com.itextpdf.io.exceptions.IOException;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.mail.MessagingException;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
@Tag(name = "Create and Manage Mood", description = "")
//@SecurityRequirement(name = "Bearer Authentication")
@RestController
@RequestMapping("/v1/mood")
@Slf4j
public class MoodController {

    private final Translator translator;
    private final MoodService moodService;
    
    public MoodController(Translator translator, MoodService moodService){
        this.moodService = moodService;
        this.translator = translator;
    }
    @PostMapping()
	    public GenericResponse addMood(@RequestParam String name)
	            throws MessagingException, IOException {
	        log.info("Adding Mood");
	        moodService.saveMood(name);
	        GenericResponse response = new GenericResponse(true);
	        response.setMessage(translator.toLocale(AppMessages.MOOD_SAVED));
	        return response;
	    }
    @GetMapping("/{id}")
    public GenericResponse getMoodById(@PathVariable String id) {
        log.info("Get mood");

        GenericResponse response = new GenericResponse(true);
        GenericData data = new GenericData();

        data.setMood(moodService.getMoodById(id));
        response.setData(data);
        return response;
    }
    
    @GetMapping()
	public GenericResponse getAllMood() {
		log.info("Get all moods");
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		data.setMoods(moodService.getAllMoods());
		response.setData(data);
		return response;
	}
    
    @GetMapping("/get-AllMood-Active")
	public GenericResponse getAllMoodsByActive() {
		log.info("Get all Moods");
		GenericResponse response = new GenericResponse(true);
		GenericData data = new GenericData();
		data.setMoods(moodService.getAllMoodsByActive());
		response.setData(data);
		return response;
	}
    
    @Operation(description = "Update Mood based on id")
	@PutMapping("/{id}")
	public GenericResponse updateMood(@PathVariable String id,
			@Valid @RequestParam String name) {
		log.info("Update mood ... {}", id);
		moodService.updateMood(name , id);
		GenericResponse response = new GenericResponse(true);
		response.setMessage(translator.toLocale(AppMessages.MOOD_UPDATED_SUCCESSFULLY));
		return response;
	}
	
	@Operation(summary = "Change action control status")
	@PutMapping("/action-control/{id}")
	public GenericResponse updateActionControlStatus(@RequestParam AccessControlStatus status, @PathVariable String id)
			throws MessagingException {
		log.info("Update mood control status ... {}", id);
		moodService.updateActionControlStatus(status, id);
		GenericResponse response = new GenericResponse(true);
		response.setMessage(translator.toLocale(AppMessages.MOOD_STATUS_CHANGED));
		return response;
	}
	
	@DeleteMapping("/{id}")
	public GenericResponse deleteMood(@PathVariable String id) {
		log.info("delete mood.....{}",id);
		moodService.deleteMood(id);
		GenericResponse response = new GenericResponse(true);
		response.setMessage(translator.toLocale(AppMessages.MOOD_DELETED));
		return response;
	}
	
	@DeleteMapping("/")
	public GenericResponse deleteAllMood(@RequestBody List<String> id) {
		log.info("delete all mood.....{}", id);
		moodService.deleteAllMood(id);
		GenericResponse response = new GenericResponse(true);
		response.setMessage(translator.toLocale(AppMessages.MOOD_ALL_DELETED));
		return response;
	}
	
	@Operation(summary = "Change all action control status")
	@PutMapping(value ="/action-controls")
	public GenericResponse updateAllActionControlStatus(@RequestParam AccessControlStatus status, @RequestBody List<String> id)
			throws MessagingException {
		log.info("Update instrument control status ... {}", id);
		moodService.updateAllActionControlStatus(status, id);
		GenericResponse response = new GenericResponse(true);
		response.setMessage(translator.toLocale(AppMessages.MOOD_ALL_STATUS_CHANGED));
		return response;
	}

}
