/*
 * Copyright (C) 2008-2020, Juick
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.juick.www.ad;

import com.juick.model.User;
import com.juick.www.controllers.Site;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponents;
import ru.sape.Sape;

import javax.inject.Inject;
import java.net.URI;

@ControllerAdvice(assignableTypes = Site.class)
@ConditionalOnProperty("sape_user")
public class SapeService {

    private final Sape sape;

    @Inject
    public SapeService(Sape sape) {
        this.sape = sape;
    }

    @ModelAttribute
    public void addSapeLinks(
            @ModelAttribute User visitor,
            @CookieValue(name = "sape_cookie", required = false, defaultValue = StringUtils.EMPTY) String sapeCookie,
            @RequestParam(required = false, defaultValue = "0") int before,
            @RequestParam(name = "show", required = false) String paramShow,
            @RequestParam(name = "search", required = false) String paramSearch,
            @RequestParam(name = "to", required = false, defaultValue = "0") Long paramTo,
            ModelMap model) {
        UriComponents builder = ServletUriComponentsBuilder.fromCurrentRequest().build();
        URI requestURI = builder.toUri();
        var showAdv = paramShow == null && before == 0 && paramSearch == null
                && visitor.isAnonymous();
        model.addAttribute("showAdv", showAdv);
        if (showAdv) {
            sape.getPageLinks(requestURI, sapeCookie)
                    .ifPresent(sapePageLinks -> model.addAttribute("links", sapePageLinks.render()));
        }
    }
}