package org.hso.ecommerce.app;

import org.hso.ecommerce.db.CustomerRepository;
import org.hso.ecommerce.entities.Customer;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.UUID;

/**
 * TODO clean up this class
 */
@Controller
public class RequestController {

    private final CustomerRepository customerRepo;

    public RequestController(CustomerRepository customerRepo) {
        this.customerRepo = customerRepo;
    }

    @GetMapping("/")
    public String greeting() {
        return "redirect:/home";
    }

    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute(new Customer());
        return "home";
    }

    @GetMapping("/greeting")
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }

    @GetMapping("/articledetail")
    public String articledetail() {
        return "articleDetail";
    }

    @GetMapping("/searchresults")
    public String searchresults() {
        return "searchResults";
    }

    @GetMapping("/employee/articles")
    public String articles() {
        return "articles";
    }

    @GetMapping("/employee/listedarticles")
    public String listedarticles() {
        return "listedArticles";
    }

    @GetMapping("/employee/listedarticlesedit")
    public String listedarticlesedit() {
        return "listedArticlesEdit";
    }

    @GetMapping("/customer/accountsettings")
    public String customerAccountSettings(Model model) {
        Customer customer = new Customer();
        customer.setFirstname("Max");
        customer.setLastname("Mustermann");
        customer.setUsername("Max.TestKunde");
        customer.setPassword("test123");
        model.addAttribute(customer);

        model.addAttribute("fullname", customer.getFirstname() + " " + customer.getLastname());
        model.addAttribute("email", "Test.User@ecommere.com");

        model.addAttribute("street", "Musterstraße 42a");
        model.addAttribute("city", "Musterstadt");
        model.addAttribute("zipcode", "12345");
        model.addAttribute("country", "Musterland");

        return "customerAccountSettings";
    }

    @RequestMapping(value="/updateAccountSettings", method=RequestMethod.POST, params="action=updateAccountSettings")
    public String updateAccountSettings(@ModelAttribute Customer customer, HttpServletResponse response) {
        // do the login magic and get a loginToken
        System.out.println(customer.username);
        System.out.println(customer.password);

        return "redirect:/customer/accountsettings";
    }

    @GetMapping("/login")
    public String login(@CookieValue(value = "loginToken", defaultValue = "") String loginToken, Model model) {
        model.addAttribute(new Customer());

        System.out.println(loginToken); // TODO if cookie is present, redirect to home
        return "login";
    }
    @RequestMapping(value="/login", method=RequestMethod.POST, params="action=login")
    public String loginAction(@ModelAttribute Customer customer, HttpServletResponse response) {
        // do the login magic and get a loginToken
        System.out.println(customer.username);
        System.out.println(customer.password);

        List<Customer> customers = customerRepo.findByUsername(customer.username);

        if (customers.size() == 1 && (customers.get(0).username.equals(customer.username) && customers.get(0).password.equals(customer.password))) {
            System.out.println("The login data is valid");

            String loginToken = UUID.randomUUID().toString();

            // set the loginToken as session cookie
            Cookie cookie = new Cookie("loginToken", loginToken);
            response.addCookie(cookie);
        } else {
            System.out.println("The login data is invalid!");
            return "redirect:/login"; // redirect so the input files get cleared, otherwise only pwd gets cleared
        }

        return "redirect:/home";
    }

    @GetMapping("/register")
    public String register(@CookieValue(value = "loginToken", defaultValue = "") String loginToken, Model model) {
        model.addAttribute(new Customer());

        System.out.println(loginToken); // TODO if cookie is present, redirect to home
        return "register";
    }



    @RequestMapping(value="/register", method=RequestMethod.POST, params="action=register")
    public String registerAction(@ModelAttribute Customer customer, HttpServletResponse response) {
        // do the register magic and get a loginToken
        System.out.println(customer.username);
        System.out.println(customer.password);

        if (customerRepo.findByUsername(customer.username).size() != 0) {
            // TODO
            System.out.println("The customer exists already");
            return "register";
        } else {
            customerRepo.save(customer);
            System.out.println(customerRepo.findByUsername(customer.username).size());
        }

        // return a login token after successful registration
        String loginToken = UUID.randomUUID().toString();

        // set the loginToken as session cookie
        Cookie cookie = new Cookie("loginToken", loginToken);
        response.addCookie(cookie);
        return "redirect:/home";
    }

    @GetMapping("/about")
    public String about() {
        return "about";
    }

    @GetMapping("/terms")
    public String terms() {
        return "terms";
    }

    @GetMapping("/privacy")
    public String privacy() {
        return "privacy";
    }

}
