#!/usr/bin/env python
"""Like merge_into.simple, except we do multiple first-second-output 
triples and may arrange the textures more efficiently, on the presumption 
that we're seeing all relevant meshes."""

import sys

import vb

QUARTERS = ['top left', 'top right', 'bottom left', 'bottom right']

def find_unused_quarter(meshes):
	available = [True, True, True, True]
	for m in meshes:
		for v in m.vertices:
			pos = v.tex()
			if pos[0] < 0.5:
				if pos[1] < 0.5:
					available[0] = False
				elif pos[1] > 0.5:
					available[2] = False
				else:
					available[0] = False
					available[2] = False
			elif pos[0] > 0.5:
				if pos[1] < 0.5:
					available[1] = False
				elif pos[1] > 0.5:
					available[3] = False
				else:
					available[1] = False
					available[3] = False
			else:
				if pos[1] < 0.5:
					available[0] = False
					available[1] = False
				elif pos[1] > 0.5:
					available[2] = False
					available[3] = False
				else:
					return None
	for i in range(0, 4):
		if available[i]:
			return i
	return None

def tp(f):
	if f < 0.5:
		return True
	if f > 0.5:
		return False
	return None

def find_quarter(meshes):
	ret = None
	for m in meshes:
		for v in m.vertices:
			t = v.tex()
			place = (tp(t[0]), tp(t[1]))
			if None in place:
				return None
			if ret is None:
				ret = place
			else:
				if ret != place:
					return None
	return ret

def quarter_desc(mesh):
	place = find_quarter(mesh)
	index = 0
	if not place[0]:
		index += 1
	if not place[1]:
		index += 2
	return QUARTERS[index]

def move_into_quarter(meshes, quarter):
	fa = 0
	sa = 0
	if quarter % 2 == 1:
		fa = 0.5
	if quarter > 1:
		sa = 0.5
	for m in meshes:
		for v in m.vertices:
			t = v.tex()
			v.settex([fa + t[0] / 2, sa + t[1] / 2])

def main():
	base_meshes = []
	merging = []
	out = []
	for i in range(1, len(sys.argv), 3):
		base_meshes.append(vb.Mesh(sys.argv[i]))
		merging.append(vb.Mesh(sys.argv[i + 1]))
		out.append(sys.argv[i + 2])
		if base_meshes[-1].fmt != merging[-1].fmt:
			raise Exception('Meshes need identical fmt files')
	#if True:
	#	for v in merging[0].vertices:
	#		t = v.tex()
	#		v.settex([t[0], t[1] + 0.5])
	if find_unused_quarter(base_meshes) is not None and find_quarter(merging) is not None:
		print (f'Put the {quarter_desc(merging)} quarter of the merging mesh in ')
		print (f'the {QUARTERS[find_unused_quarter(base_meshes)]} quarter of the base mesh.')
	elif find_unused_quarter(merging) is not None and find_quarter(base_meshes) is not None:
		print (f'Put the {quarter_desc(base_meshes)} quarter of the base mesh in ')
		print (f'the {QUARTERS[find_unused_quarter(merging)]} quarter of the merging mesh.')
	elif find_unused_quarter(base_meshes) is not None:
		q = find_unused_quarter(base_meshes)
		move_into_quarter(merging, q)
		print (f'Put the merging mesh in the {QUARTERS[q]} quarter of the base mesh, ')
		print ('Scaling up or down as appropriate.')
	elif find_unused_quarter(merging) is not None:
		q = find_unused_quarter(merging)
		move_into_quarter(base_meshes, q)
		print (f'Put the base mesh in the {QUARTERS[q]} quarter of the merging mesh, ')
		print ('Scaling up or down as appropriate.')
	else:
		print ('The texture for the combined mesh should have the original textures in')
		print ('the top left quarter, and the added textures in the top right quarter')
		move_into_quarter(base_meshes, 0)
		move_into_quarter(merging, 1)
	for i in range(len(base_meshes)):
		base_meshes[i].vertices.extend(merging[i].vertices)
		for f in merging[i].faces:
			f[0] += base_meshes[i].lv
			f[1] += base_meshes[i].lv
			f[2] += base_meshes[i].lv
			base_meshes[i].faces.append(f)
		base_meshes[i].lv += merging[i].lv
		base_meshes[i].lf += merging[i].lf
		base_meshes[i].write(out[i])

if __name__ == '__main__':
	  main()
	
