get_player <- function(rcg, name) {
    output <- rcg |>
        dplyr::inner_join(name, by = "side") |>
        dplyr::filter(is.na(stime)) |>
        dplyr::select(
            step,
            team = name,
            side,
            unum,
            px = x,
            py = y,
            pvx = vx,
            pvy = vy,
            body,
            neck,
        )

    return(output)
}

get_action <- function(rcl, ball, players) {
    output <- rcl |>
        dplyr::filter(command == "kick" | command == "tackle") |>
        dplyr::mutate(
            x = args |> stringr::str_extract("[0-9\\-\\.]+"),
            l1 = args |> stringr::str_remove(x),
            y = l1 |> stringr::str_extract("[0-9\\-\\.]+"),
            unum = as.numeric(unum)
        ) |>
        dplyr::select(
            step,
            team,
            unum,
            command,
            ax = x,
            ay = y,
        ) |>
        dplyr::inner_join(ball, by = "step") %>%
        dplyr::inner_join(players, by = c("step", "team", "unum")) %>%
        dplyr::mutate(after_team = lead(team)) %>%
        dplyr::mutate(a_sameteam = (after_team == team)) %>%
        dplyr::mutate(tackle_scc = (command == "tackle" & a_sameteam)) %>%
        dplyr::mutate(a_tackle_scc = lead(tackle_scc)) %>%
        dplyr::select(-c(after_team, a_sameteam))

    return(output)
}

get_tackle <- function(action) {
    output <- action %>%
        dplyr::filter(command == "tackle") %>%
        dplyr::select(-c(a_tackle_scc, ax, ay))
    return(output)
}



get_kick_log <- function(action) {
  output <- action %>%
    dplyr::filter(command == "kick") %>%
    dplyr::mutate(before_team = lag(team)) %>%
    dplyr::mutate(before_unum = lag(unum)) %>%
    dplyr::mutate(after_team = lead(team)) %>%
    dplyr::mutate(after_unum = lead(unum)) %>%
    dplyr::mutate(b_sameteam = (before_team == team)) %>%
    dplyr::mutate(b_sameunum = (before_unum == unum)) %>%
    dplyr::mutate(a_sameteam = (after_team == team)) %>%
    dplyr::mutate(a_sameunum = (after_unum == unum))
  
  output$b_sameteam[1] <- TRUE
  output$b_sameunum[1] <- FALSE
  
  output <- output %>%
    dplyr::mutate(dribble = (a_sameteam & a_sameunum)) %>%
    dplyr::mutate(pass = (a_sameteam & !a_sameunum)) %>%
    group_by(grc = cumsum(!dribble)) %>%
    mutate(touch = row_number()) %>%
    ungroup() %>%
    select(-c(tackle_scc, grc, before_team, before_unum, b_sameteam, b_sameunum, after_team, after_unum, a_sameteam, a_sameunum))
  return(output)
}

get_kick <- function(action) {
    output <- action %>%
        dplyr::filter(command == "kick") %>%
        dplyr::mutate(after_team = lead(team)) %>%
        dplyr::mutate(after_unum = lead(unum)) %>%
        dplyr::mutate(a_sameteam = (after_team == team)) %>%
        dplyr::mutate(a_sameunum = (after_unum == unum)) %>%
        select(-c(command, pvx, pvy, body, neck)) %>% 
        dplyr::mutate(next_ball_x = lead(ball_x)) %>%
        dplyr::mutate(next_ball_y = lead(ball_y))


    return(output)
}

get_action_Allplayer <- function(players,action){
  action <- action  %>% 
    dplyr::select(step,action_team=team,ball_x,ball_y,pass,dribble)
  output <- players  %>% 
    dplyr::inner_join(action,by = "step")
  return(output)
}

get_pass_Allplayer <- function(players,pass){
    pass <- pass  %>% 
        dplyr::select(step,ax,ay,pass_team=team,ball_x,ball_y,ball_vx,ball_vy,pass_scc)
    output <- players  %>% 
        dplyr::inner_join(pass,by = "step")
    return(output)
}

get_dribble_Allplayer <- function(players,dribble){
    dribble <- dribble  %>% 
        dplyr::select(step,dribble_team=team,ball_x,ball_y,dribble_scc)
    output <- players  %>% 
        dplyr::inner_join(dribble,by = "step")
    return(output)
}

get_pass <- function(kick) {
    output <- kick %>%
        dplyr::mutate(pass_scc = (a_sameteam & !a_sameunum)) %>%
        dplyr::mutate(pass = ((a_sameteam & !a_sameunum) | (!a_tackle_scc & !a_sameteam))) %>%
        dplyr::filter(pass) %>%
        distinct(step,.keep_all=TRUE) %>%
        select(-c(a_tackle_scc,tackle_scc, pass, a_sameteam, a_sameunum, after_team, after_unum))

    return(output)
}




get_dribble <- function(kick) {
    output <- kick %>%
        dplyr::mutate(dribble = ((!a_sameteam & a_tackle_scc) | (a_sameteam & a_sameunum))) %>%
        dplyr::mutate(dribble_scc = (a_sameteam & a_sameunum)) %>%
        group_by(grc = cumsum(!dribble)) %>%
        mutate(touch = row_number()) %>%
        ungroup() %>%
        dplyr::filter(dribble) %>%
        select(-c(a_tackle_scc,tackle_scc, dribble, a_sameteam, a_sameunum, after_team, after_unum, dribble, grc))

    return(output)
}

read_referee <- function(path_rcl) {
    referee <- path_rcl |>
        readr::read_lines() |>
        tibble::as_tibble() |>
        dplyr::mutate(
            step = value |> stringr::str_extract("\\d+"),
            command = value |>
                stringr::str_extract("referee [a-zA-Z0-9_]*") |>
                stringr::str_remove("referee "),
            step = as.numeric(step),
        ) |>
        dplyr::select(
            step,
            command,
        ) %>%
        tidyr::drop_na()


    return(referee)
}

read_goal <- function(referee, name) {
    goal <- referee |>
        dplyr::filter(stringr::str_detect(command, "goal_[rl]_[0-9]+")) |>
        dplyr::mutate(
            side = command |>
                stringr::str_remove("goal_") |>
                stringr::str_extract("[rl]"),
            score = command |>
                stringr::str_remove("goal_[rl]_") |>
                stringr::str_extract("[0-9]+"),
        ) |>
        dplyr::inner_join(name, by = "side") |>
        dplyr::select(
            step,
            side,
            name,
            score,
        ) %>%
        tidyr::drop_na()

    return(goal)
}

before_goal <- function(kick_log, goal_step, goal_team) {
    playlist <- kick_log %>%
        dplyr::arrange(desc(step)) %>%
        dplyr::filter(
            step > goal_step - 100,
            step < goal_step,
            team == goal_team,
        )
}

get_goal_playlist <- function(kick_log, goal) {
    if (length(goal$step) < 1) {
        return(NA)
    }
    i <- 1
    output <- before_goal(kick_log, goal$step[i], goal$name[i])
    i <- i + 1
    while (i <= length(goal$step)) {
        # print(i)
        i_list <- before_goal(kick_log, goal$step[i], goal$name[i])
        output <- output |> bind_rows(i_list)
        i <- i + 1
    }
    # for(i in goal$step){
    #   i_list <- before_goal(kick_log,goal$step[i],goal$name[i])
    #   output <- output |> bind_rows(i_list)
    #   print(i)
    # }
    return(output)
}

convert_by_step <- function(rcg, rcl) {
    output <- dplyr::inner_join(rcg, rcl, by = "step")
    return(output)
}

get_dribble_point <- function(log_data) {
    output <- log_data %>% filter(dribble == TRUE, pass == FALSE)
    return(output)
}

get_pass_point <- function(log_data) {
    output <- log_data %>% filter(pass == TRUE)
    return(output)
}

get_tackle_point <- function(log_data) {
    output <- log_data %>% filter(tackle == TRUE)
    return(output)
}

get_rcl <- function(path_rcl) {
    output <- path_rcl |> read_rcl()
    return(output)
}

get_name <- function(path_rcg) {
    team_name <- path_rcg |>
        stringr::str_extract("[a-zA-Z0-9_-]*.rcg") |>
        stringr::str_remove("[0-9]*-") |>
        stringr::str_remove(".rcl")
    l_team <- team_name |>
        stringr::str_extract("[a-zA-Z0-9_]*-vs-") |>
        stringr::str_remove("_[0-9]*-vs-")
    r_team <- path_rcg |>
        stringr::str_extract("[a-zA-Z0-9_]*.rcg") |>
        stringr::str_remove("_[0-9]*.rcg")
    name_table <- tibble::tribble(
        ~side, ~name,
        "l", l_team,
        "r", r_team,
    )

    return(name_table)
}

replase_rcg_to_rcl <- function(path_rcg) {
    output <- path_rcg |> stringr::str_replace(pattern = ".rcg", replacement = ".rcl")
}
replase_rcl_to_rcg <- function(path_rcl) {
    output <- path_rcl |> stringr::str_replace(pattern = ".rcl", replacement = ".rcg")
}


kick_dist <- function(rcg) {
    ball_path <- rcg |>
        dplyr::group_nest(step, ball_x, ball_y) |>
        dplyr::mutate(
            move_dist_x = ball_x - dplyr::lag(ball_x),
            move_dist_y = ball_y - dplyr::lag(ball_y),
            move_dist = sqrt(move_dist_x^2 + move_dist_y^2),
            move_dist = dplyr::if_else(is.na(move_dist), 0, move_dist)
        ) |>
        dplyr::filter(move_dist != 0 & move_dist < 40)
}

select_name <- function(data,name){
    output <- data  %>% 
        dplyr::filter(team %in% name)
    return(output)
}

get_AttackLine <- function(data){
    output <- data  %>%
        dplyr::group_by(step) %>% 
        filter(px == max(px)) %>% 
        dplyr::select(
          step,
          pass_team,
          pass_scc,
          AL=px
          )
    return(output)
}

get_DefendLine <- function(data){
    output <- data  %>%
        dplyr::group_by(step) %>% 
        filter(px == min(px)) %>% 
        dplyr::select(step,DL=px)
    return(output)
}

get_MedianLine <- function(data){
    output <- data  %>%
        dplyr::group_by(step) %>% 
        dplyr::summarize(ML=median(px)) %>% 
        dplyr::select(step,ML)
    return(output)
}

get_DynamicPressureLine <- function(data){
    data <- data  %>% 
        filter(unum != 1)
    ad <- get_AttackLine(data)
    dd <- get_DefendLine(data)
    md <- get_MedianLine(data)
    output <- dplyr::inner_join(ad,dd,by = "step") %>% 
              dplyr::inner_join(md,by = "step") %>%
              distinct(step,.keep_all=TRUE)
    return(output)
}