```python
def judge_lancer(board: list, side: str, origin: list, dest: list) -> str:
    if len(board) != 7 or any(len(row) != 7 for row in board):
        raise ValueError("Board must be a 7x7 grid of 'W', 'B', and '.'")
    if side not in ('W', 'B'):
        raise ValueError("Side must be 'W' or 'B'")
    if not (isinstance(origin, list) and len(origin) == 2):
        raise ValueError("Origin must be a pair of integers")
    if not (isinstance(dest, list) and len(dest) == 2):
        raise ValueError("Destination must be a pair of integers")
    for pos in origin + dest:
        if not isinstance(pos[0], int) or not isinstance(pos[1], int) or not (0 <= pos[0] < 7 and 0 <= pos[1] < 7):
            raise ValueError("Coordinates must be integers within bounds")

    row_offset, col_offset = dest[0] - origin[0], dest[1] - origin[1]
    if abs(row_offset) + abs(col_offset) != 3:
        return "bad_line"

    current_row, current_col = origin
    while (current_row, current_col) != dest:
        current_row += row_offset // abs(row_offset)
        current_col += col_offset // abs(col_offset)
        if board[current_row][current_col] != '.':
            return "blocked"

    if side == 'W' and board[dest[0]][dest[1]] in ('W', '.'):
        return "ok"
    elif side == 'B' and board[dest[0]][dest[1]] in ('B', '.'):
        return "ok"
    else:
        return "own_piece" if (side == 'W' and board[dest[0]][dest[1]] == 'W') or (side == 'B' and board[dest[0]][dest[1]] == 'B') else "too_close"
```