package com.github.arteam.jdit.domain;

import com.github.arteam.jdit.domain.entity.Division;
import com.github.arteam.jdit.domain.entity.Player;
import com.github.arteam.jdit.domain.entity.Team;
import org.jdbi.v3.sqlobject.CreateSqlObject;
import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import org.jdbi.v3.sqlobject.transaction.Transaction;

import java.util.List;

/**
 * Date: 2/7/15
 * Time: 4:57 PM
 *
 * @author Artem Prigoda
 */
@RegisterRowMapper(PlayerSqlObject.PlayerMapper.class)
public interface TeamSqlObject {

    @CreateSqlObject
    PlayerSqlObject playerDao();

    @SqlUpdate("insert into teams(name, division) values (:name, :division)")
    @GetGeneratedKeys
    long createTeam(@Bind("name") String name, @Bind("division") Division division);

    @SqlUpdate("insert into roster(team_id, player_id) values (:team_id, :player_id)")
    void addPlayerToTeam(@Bind("team_id") long teamId, @Bind("player_id") long playerId);

    @Transaction
    default void addTeam(Team team, List<Player> players) {
        long teamId = createTeam(team.name, team.division);
        for (Player player : players) {
            long playerId = playerDao().createPlayer(player);
            addPlayerToTeam(teamId, playerId);
        }
    }

    @SqlQuery("select * from players p " +
            "inner join roster r on r.player_id=p.id " +
            "inner join teams t on r.team_id=t.id " +
            "where t.name = :team_name " +
            "order by p.last_name")
    List<Player> getPlayers(@Bind("team_name") String teamName);
}