# -*- coding: utf-8 -*-

# use Gurobi's Python library
import numpy as np
import gurobipy as gp
from data_warehouse import *

# ------------------------
# Optimisation d'entrepôts
# ------------------------

# Data
n,m,c,f,d,M = data_warehouse()

#---------------------------
# Définition du modèle
#---------------------------
model = gp.Model("optimisation entrepots")

# Variables :
# x_ij  = quantite de produits transportée de l'entrepot i au magasin j
# y_i = 1 si l'entrepot i est ouvert; = 0 sinon

x = {} # x et y sont des dictionnaires
for i in range(n):
    for j in range(m):
        x[(i, j)] = model.addVar(vtype='C', name=f"x_{i}_{j}")

model.update() # mise à jour du modèle

y = {} 
for i in range(n):
   y[i] = model.addVar(vtype=gp.GRB.BINARY, name=f"y_{i}")

model.update() # mise à jour du modèle

# contraintes
for j in range(m):
    model.addConstr(gp.quicksum(x[(i, j)] for i in range(n)) == d[j])

for i in range(n):
    model.addConstr(gp.quicksum(x[(i, j)] for j in range(m)) <= M*y[i])

# Fonction objectif
model.setObjective(gp.quicksum(c[i,j]*x[(i, j)] for i in range(n) for j in range(m)) + gp.quicksum(f[i]* y[i] for i in range(n)), gp.GRB.MINIMIZE)

# now solve the model
model.optimize()

# for debugging and information purposes, write out LP 
model.write("warehouse.lp")

sol=np.array(model.X)
xsol = sol[:n*m]
xsol=np.reshape(xsol,(n,m),order='C')
ysol = sol[n*m:]
#print(xsol)
#print(ysol)
print("\nDemandes des magasins :")
print(f'd={d}')

for i in range(n):
    print(f'Entrepot {i}:')
    if ysol[i]==0:
        print('  fermé / vérification :')
    for j in range(m):
        print(f'  - magasin {j} : {xsol[i,j]}')




