package com.ufund.api.ufundapi.controller;

import java.io.IOException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ufund.api.ufundapi.service.AuthService;

@RestController
@RequestMapping("auth")
public class AuthController {
    private static final Logger LOG = Logger.getLogger(AuthController.class.getName());
    private final AuthService authService;

    public AuthController(AuthService authService) {
        this.authService = authService;
    }

    /**
     * Attempts to log in as a user
     *
     * @param params A json object in the format {username: string, password: string}
     * @return An api key and status OK if the authentication was successful,
     * Status UNAUTHORIZED if the authentication failed and INTERNAL SERVER ERROR otherwise.
     */
    @PostMapping("")
    public ResponseEntity<String> login(@RequestBody Map<String, String> params) {
        LOG.log(Level.INFO, "POST /auth body={0}", params);
        String username = params.get("username");
        String password = params.get("password");
        try {
            String key = authService.login(username, password);
            return new ResponseEntity<>(key, HttpStatus.OK);
        } catch (IllegalAccessException ex) {
            LOG.log(Level.WARNING, ex.getLocalizedMessage());
            return new ResponseEntity<>(ex.getMessage(), HttpStatus.UNAUTHORIZED);
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, ex.getLocalizedMessage());
            return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * Logs out the current user
     *
     * @param key The API sent by the client in the header
     * @return OK if the user was successfully logged out, INTERNAL_SERVER_ERROR otherwise.
     */
    @DeleteMapping("")
    public ResponseEntity<Object> logout(@RequestHeader("jelly-api-key") String key) {
        LOG.log(Level.INFO, "DELETE /auth key={0}", key);
        try {
            authService.logout(key);
            return new ResponseEntity<>(HttpStatus.OK);
        } catch (IOException ex) {
            LOG.log(Level.WARNING, ex.getLocalizedMessage());
            return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}