import sys,unittest,json,hashlib
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parents[3]))
from hesper.tests.test_h79_arrival import ArrivalCase,START_TURN
from hesper.laws.terrain import gather
class Probe(ArrivalCase):
 def resolve(self):
  from unittest import mock
  with mock.patch('hesper.turn.seal_mod.seal_turn',return_value={'note':'probe'}), mock.patch('hesper.turn.seal_mod.git_seal_turn',return_value={'note':'probe'}):
   return super().resolve()
 def test_split_actions(self):
  a=self.citizen('SplitA',0,START_TURN-2);b=self.citizen('SplitB',1,START_TURN-2)
  self.stand_holds(6)
  for who,tag,acts in [(a,'split-a',[{'type':'gather','pulls':2},{'type':'gather','pulls':2}]),(b,'split-b',[{'type':'gather','pulls':4}])]:
   status,sent=self.batch(who,tag,acts);self.assertEqual(status,202,sent);self.assertTrue(all(r['accepted'] for r in sent['results']),sent)
  turn=self.resolve().turn
  c=self.conn();records=[dict(r) for r in c.execute("SELECT r.player_id,a.result_json FROM actions a JOIN requests r USING(request_id) WHERE a.type='gather' ORDER BY r.player_id,a.idx")];c.close()
  print('MULTI',records)
  print('REPORT',self.report_text(a,turn))
  self.assertIn('both arrived this turn',self.report_text(a,turn))
  self.assertEqual((self.carried(a),self.carried(b)),(4,2))
 def test_failed_tool_loses_resource(self):
  self.ROW=1
  a=self.citizen('BrokenA',0,START_TURN-2);b=self.citizen('HealthyB',1,START_TURN-2)
  self.stand_holds(4)
  for who,tag in [(a,'badwear-a'),(b,'badwear-b')]:
   status,sent=self.batch(who,tag,[{'type':'gather','pulls':1}]);self.assertEqual(status,202,sent);self.assertTrue(sent['results'][0]['accepted'])
  c=self.conn();c.execute("UPDATE things SET state_json=json_set(state_json,'$.worn_turn','bad') WHERE owner_player=? AND thing_id != (SELECT avatar_thing_id FROM players WHERE player_id=?)",(a[1],a[1]));c.commit();c.close()
  self.resolve()
  c=self.conn();left=c.execute('SELECT resource_qty FROM tiles WHERE x=4 AND y=1').fetchone()[0];c.close()
  self.assertEqual(self.record(a)['outcome'],'action_failed')
  self.assertEqual((self.carried(a),self.carried(b),left),(0,2,0))
  print('REAL RUNNER CONSERVATION: initial4, failedA0, healthyB2, deposit0')
if __name__=='__main__':unittest.main()
