// defmodule WebWars.Engine.Ability.CaptureTest {
//   @moduledoc false

//   use WebWars.DataCase
//   alias Ecto.UUID
//   alias WebWars.Engine.{
//     Action,
//     Ability,
//     Game,
//     MapSettings, 
//     Power,
//     PowerData,
//     Tile,
//     TileData,
//     Unit,
//     UnitData,
//     UserData,
//   }

//   describe "apply/2" {
//     test "reduces tile capture strength" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 20,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 100,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {power_data: []},
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 10,
//             team: 1,
//             user_id: "00000000-0000-0000-0000-000000000000"
//           }
//         ]
//       } = game
//     }
//     test "reduces tile capture strength with minimum health" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 20,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 1,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {power_data: []},
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 19,
//             team: 1,
//             user_id: "00000000-0000-0000-0000-000000000000"
//           }
//         ]
//       } = game
//     }

//     test "transfers ownership of tile" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 10,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 100,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {power_data: []},
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 20,
//             team: 2,
//             user_id: "00000000-0000-0000-0000-000000000001"
//           }
//         ]
//       } = game
//     }

//     test "reduces tile capture strength with bonus, positive" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 20,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 100,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {
//           power_data: [
//             PowerData {
//               power_id: Power.CaptureBonus.id(),
//               params: ["50"]
//             }
//           ]
//         },
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 5,
//             team: 1,
//             user_id: "00000000-0000-0000-0000-000000000000"
//           }
//         ]
//       } = game
//     }

//     test "reduces tile capture strength with minimum health and bonus, positive" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 20,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 1,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {
//           power_data: [
//             PowerData {
//               power_id: Power.CaptureBonus.id(),
//               params: ["100"]
//             }
//           ]
//         },
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 18,
//             team: 1,
//             user_id: "00000000-0000-0000-0000-000000000000"
//           }
//         ]
//       } = game
//     }

//     test "instantly captures tile with bonus" {
//       tile_data = TileData {
//         id: UUID.generate(),
//         tile_id: Tile.City.id(),
//         tile: Tile.City.create(),
//         capture_health: 20,
//         team: 1,
//         user_id: "00000000-0000-0000-0000-000000000000"
//       }
//       action = Action {
//         kind: "ability",
//         ability_id: AbilityKind::Capture,
//         subject: UnitData {
//           health: 100,
//           team: 2,
//           unit: Unit {},
//           user_id: "00000000-0000-0000-0000-000000000001"
//         },
//         subject_user_data: UserData {
//           power_data: [
//             PowerData {
//               power_id: Power.InstantCapture.id(),
//             }
//           ]
//         },
//         target: tile_data,
//         game: Game {
//           map_settings: MapSettings {
//             capture_strength: 20
//           },
//           tile_data: [tile_data],
//           user_data: [
//             UserData {
//               user_id: "00000000-0000-0000-0000-000000000000"
//             }
//           ]
//         }
//       }

//       {game, _} = Ability.Capture.create().apply.(action)

//       assert Game {
//         tile_data: [
//           TileData {
//             capture_health: 20,
//             team: 2,
//             user_id: "00000000-0000-0000-0000-000000000001"
//           }
//         ]
//       } = game
//     }
//   }
// }


    // test "create_action/1 kind: ability/capture" {
    //   user = insert(:user)
    //   commander = insert(:commander)
    //   user_data = build(:user_data, %{
    //     turn: true,
    //     user_id: user.id,
    //     commander_id: commander.id
    //   })
    //   unit_data = unit_data(AWDS.infantry(), %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     user_id: user_data.user_id,
    //     health: 100,
    //     faction: 1
    //   })
    //   tile_data = build(:tile_data, %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     tile_id: Tile.City.id(),
    //     capture_health: 10,
    //     user_id: nil,
    //   })
    //   game = insert(:game, %{
    //     user_data: [user_data],
    //     tile_data: [tile_data],
    //     unit_data: [unit_data]
    //   })

    //   tile_data = game.tile_data |> Enum.at(0)
    //   unit_data = game.unit_data |> Enum.at(0)

    //   insert(:game_user, %{game: game, faction: 1})
    //   insert(:game_user, %{game: game, faction: 2})
    //   action = build(:action, %{
    //     kind: "ability",
    //     ability_id: AbilityKind::Capture,
    //     subject_unit_data_id: unit_data.id,
    //     target_tile_data_id: tile_data.id,
    //     game_id: game.id,
    //     user_id: user.id
    //   })
    //   |> Map.from_struct()

    //   assert {:ok, Action {
    //     game: Game {
    //       tile_data: [
    //         TileData {user_id: user_id, capture_health: 20, faction: nil}
    //       ]
    //     }
    //   }} = Engine.create_action(action)
    //   assert user_id == user_data.user_id
    // }

    // test "create_action/1 kind: ability/capture ends game user" {
    //   user = insert(:user)
    //   commander = insert(:commander)
    //   user_data_one = build(:user_data, %{
    //     turn: true,
    //     user_id: user.id,
    //     commander_id: commander.id,
    //     team: 1,
    //     faction: 1
    //   })
    //   user_data_two = build(:user_data, %{
    //     turn: false,
    //     user_id: insert(:user).id,
    //     commander_id: commander.id,
    //     team: 2,
    //     faction: 2
    //   })
    //   unit_data = unit_data(AWDS.infantry(), %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     user_id: user_data_one.user_id,
    //     health: 100,
    //     faction: 1,
    //     team: 1
    //   })
    //   tile_data = build(:tile_data, %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     tile_id: Tile.HQ.id(),
    //     capture_health: 10,
    //     user_id: user_data_two.user_id,
    //     team: 2,
    //     faction: 2
    //   })
    //   game = insert(:game, %{
    //     user_data: [user_data_one, user_data_two],
    //     tile_data: [tile_data],
    //     unit_data: [unit_data]
    //   })

    //   tile_data = game.tile_data |> Enum.at(0)
    //   unit_data = game.unit_data |> Enum.at(0)

    //   insert(:game_user, %{game: game, faction: 1})
    //   insert(:game_user, %{game: game, faction: 2})
    //   action = build(:action, %{
    //     kind: "ability",
    //     ability_id: AbilityKind::Capture,
    //     subject_unit_data_id: unit_data.id,
    //     target_tile_data_id: tile_data.id,
    //     game_id: game.id,
    //     user_id: user.id
    //   })
    //   |> Map.from_struct()

    //   assert {:ok, Action {
    //     game: Game {
    //       active: false,
    //       tile_data: [
    //         TileData {user_id: user_id, capture_health: 20, faction: 2, team: 1}
    //       ],
    //       user_data: [
    //         UserData {team: 2, active: false, state: "defeat"},
    //         UserData {team: 1, active: true}
    //       ]
    //     }
    //   } = action} = Engine.create_action(action)
    //   assert user_id == user_data_one.user_id

    //   assert_delivered_email WebWarsNotify.Mailers.GameEnd.email(action)
    //   refute_delivered_email WebWarsNotify.Mailers.Defeat.email(action)
    // }

    // test "create_action/1 kind: ability/capture deactivates user" {
    //   user = insert(:user)
    //   user_two = insert(:user)
    //   user_three = insert(:user)
    //   commander = insert(:commander)
    //   user_data_one = build(:user_data, %{
    //     turn: true,
    //     user_id: user.id,
    //     commander_id: commander.id,
    //     team: 1,
    //     faction: 1
    //   })
    //   user_data_two = build(:user_data, %{
    //     turn: false,
    //     user_id: user_two.id,
    //     commander_id: commander.id,
    //     team: 2,
    //     faction: 2
    //   })
    //   user_data_three = build(:user_data, %{
    //     team: 3,
    //     faction: 3,
    //     commander_id: commander.id,
    //     user_id: user_three.id
    //   })
    //   unit_data = unit_data(AWDS.infantry(), %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     user_id: user_data_one.user_id,
    //     health: 100,
    //     faction: 1,
    //     team: 1
    //   })
    //   tile_data = build(:tile_data, %{
    //     coord: build(:coord, %{x: 0, y: 0}),
    //     tile_id: Tile.HQ.id(),
    //     capture_health: 10,
    //     user_id: user_data_two.user_id,
    //     team: 2,
    //     faction: 2
    //   })
    //   game = insert(:game, %{
    //     user_data: [
    //       user_data_one,
    //       user_data_two,
    //       user_data_three
    //     ],
    //     tile_data: [tile_data],
    //     unit_data: [unit_data]
    //   })

    //   tile_data = game.tile_data |> Enum.at(0)
    //   unit_data = game.unit_data |> Enum.at(0)

    //   insert(:game_user, %{game: game, faction: 1})
    //   insert(:game_user, %{game: game, faction: 2})
    //   action = build(:action, %{
    //     kind: "ability",
    //     ability_id: AbilityKind::Capture,
    //     subject_unit_data_id: unit_data.id,
    //     target_tile_data_id: tile_data.id,
    //     game_id: game.id,
    //     user_id: user.id
    //   })
    //   |> Map.from_struct()

    //   assert {:ok, Action {
    //     game: Game {
    //       active: true,
    //       tile_data: [
    //         TileData {user_id: user_id, capture_health: 20, faction: 2, team: 1}
    //       ],
    //       user_data: [
    //         UserData {team: 2, active: false, state: "defeat"},
    //         UserData {team: 1, active: true, state: nil},
    //         UserData {team: 3, active: true, state: nil}
    //       ]
    //     }
    //   }} = Engine.create_action(action)
    //   assert user_id == user_data_one.user_id

    //   [
    //     Action {kind: "ability"},
    //     Action {kind: "defeat"} = defeat_action
    //   ] = Engine.list_actions()

    //   defeat_action = Action {defeat_action | game: game, user: user_two}

    //   assert_delivered_email WebWarsNotify.Mailers.Defeat.email(defeat_action)
    // }