-- ============================================================
-- Money+Xfer — Migration v3.1
-- Nouveautés :
--   1. Workflow complet :
--      en_attente → facture_soumise → agent_verifie → chef_verifie
--      → facture_validee → paiement_soumis → paiement_verifie
--      → transaction_confirmee → partenaire_assigne
--   2. Wallet client XAF : recharges admin, historique
--   3. Table wallet_recharges (demandes + validation admin)
-- ============================================================
-- ORDRE : après migration_v3.0
-- Compatible MySQL 5.7+ / MariaDB 10.2+
-- ============================================================

USE akuxfer;
SET @db = DATABASE();

-- ============================================================
-- 1. MISE À JOUR DU STATUT WORKFLOW COMPLET
-- ============================================================

ALTER TABLE client_transaction_requests
  MODIFY COLUMN status ENUM(
    -- Portail client soumet la demande
    'en_attente',           -- Demande créée, pas encore de facture
    'facture_soumise',      -- Client a joint la facture/preuve d'achat
    -- Back-office : vérifications
    'agent_verifie',        -- Agent a vérifié la facture (KYC/docs)
    'chef_verifie',         -- Chef agence a validé
    'facture_validee',      -- Responsable Ops a validé → client doit payer
    -- Client effectue le paiement
    'paiement_soumis',      -- Client a soumis preuve de paiement (wallet ou virement)
    -- Back-office valide le paiement
    'paiement_verifie',     -- Agent a vérifié le paiement reçu
    'transaction_confirmee',-- Transaction Money+Xfer créée et confirmée
    'partenaire_assigne',   -- Partenaire destinataire assigné, fonds en route
    -- Cas négatifs
    'rejete',               -- Rejeté à une étape (motif obligatoire)
    'annule'                -- Annulé par le client ou l'admin
  ) NOT NULL DEFAULT 'en_attente';

-- Colonnes pour le paiement client (preuve de virement ou wallet)
SET @q = IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA=@db AND TABLE_NAME='client_transaction_requests' AND COLUMN_NAME='payment_proof_file')=0,
  "ALTER TABLE client_transaction_requests
     ADD COLUMN payment_proof_file   VARCHAR(255) DEFAULT NULL AFTER proof_file,
     ADD COLUMN payment_submitted_at DATETIME     DEFAULT NULL AFTER payment_proof_file,
     ADD COLUMN payment_verified_by  INT UNSIGNED DEFAULT NULL AFTER payment_submitted_at,
     ADD COLUMN payment_verified_at  DATETIME     DEFAULT NULL AFTER payment_verified_by,
     ADD COLUMN payment_notes        TEXT         DEFAULT NULL AFTER payment_verified_at",
  'SELECT 1'
);
PREPARE s FROM @q; EXECUTE s; DEALLOCATE PREPARE s;

-- Colonne partenaire assigné
SET @q = IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA=@db AND TABLE_NAME='client_transaction_requests' AND COLUMN_NAME='assigned_partner_id')=0,
  "ALTER TABLE client_transaction_requests
     ADD COLUMN assigned_partner_id  INT UNSIGNED DEFAULT NULL AFTER ops_at,
     ADD COLUMN assigned_at          DATETIME     DEFAULT NULL AFTER assigned_partner_id,
     ADD COLUMN assigned_by          INT UNSIGNED DEFAULT NULL AFTER assigned_at,
     ADD COLUMN partner_notes        TEXT         DEFAULT NULL AFTER assigned_by",
  'SELECT 1'
);
PREPARE s FROM @q; EXECUTE s; DEALLOCATE PREPARE s;

-- ============================================================
-- 2. TABLE WALLET RECHARGES (demandes + validation admin)
-- ============================================================

CREATE TABLE IF NOT EXISTS wallet_recharges (
    id              INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    account_id      INT UNSIGNED NOT NULL,
    wallet_id       INT UNSIGNED NOT NULL,
    amount          DECIMAL(15,2) NOT NULL,
    currency        VARCHAR(10)   NOT NULL DEFAULT 'XAF',
    -- Méthode de paiement utilisée pour la recharge
    method          ENUM('virement','mobile_money','cash','carte','wallet_interne') NOT NULL DEFAULT 'virement',
    reference       VARCHAR(100)  DEFAULT NULL,   -- Référence virement / transaction MM
    proof_file      VARCHAR(255)  DEFAULT NULL,   -- Preuve de paiement uploadée
    notes           TEXT          DEFAULT NULL,   -- Note du client
    -- Traitement admin
    status          ENUM('en_attente','approuvee','rejetee') NOT NULL DEFAULT 'en_attente',
    admin_id        INT UNSIGNED  DEFAULT NULL,
    admin_notes     TEXT          DEFAULT NULL,
    processed_at    DATETIME      DEFAULT NULL,
    -- Horodatage
    created_at      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (account_id) REFERENCES client_accounts(id) ON DELETE CASCADE,
    FOREIGN KEY (wallet_id)  REFERENCES client_wallets(id) ON DELETE CASCADE,
    INDEX idx_account(account_id),
    INDEX idx_status(status),
    INDEX idx_created(created_at)
) ENGINE=InnoDB;

-- ============================================================
-- 3. COLONNE reference sur client_wallet_transactions
-- ============================================================

SET @q = IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA=@db AND TABLE_NAME='client_wallet_transactions' AND COLUMN_NAME='recharge_id')=0,
  "ALTER TABLE client_wallet_transactions
     ADD COLUMN recharge_id INT UNSIGNED DEFAULT NULL AFTER request_id,
     ADD INDEX idx_recharge(recharge_id)",
  'SELECT 1'
);
PREPARE s FROM @q; EXECUTE s; DEALLOCATE PREPARE s;

-- ============================================================
-- 4. PERMISSIONS NOUVELLES
-- ============================================================

INSERT IGNORE INTO permissions (module, action, label) VALUES
-- Workflow étendu
('client_requests', 'verify_payment',     'Vérifier le paiement client'),
('client_requests', 'confirm_transaction','Confirmer la transaction'),
('client_requests', 'assign_partner',     'Assigner un partenaire'),
-- Wallet recharges
('wallet',          'manage_recharges',   'Gérer les demandes de recharge wallet'),
('wallet',          'approve_recharge',   'Approuver une recharge wallet'),
('wallet',          'reject_recharge',    'Rejeter une recharge wallet');

-- Agent : peut vérifier paiement
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p
WHERE r.name = 'agent'
  AND p.module = 'client_requests'
  AND p.action IN ('verify_payment','confirm_transaction');

-- Chef/Manager : tout sauf assign partner
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p
WHERE r.name IN ('manager','chef_agence')
  AND p.module = 'client_requests'
  AND p.action IN ('verify_payment','confirm_transaction','assign_partner');

-- Admin/Resp. Ops : tout
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p
WHERE r.name IN ('super_admin','admin','responsable_ops')
  AND p.module IN ('client_requests','wallet')
  AND p.action IN ('verify_payment','confirm_transaction','assign_partner',
                   'manage_recharges','approve_recharge','reject_recharge');

-- ============================================================
-- 5. INDEX SUPPLÉMENTAIRES
-- ============================================================

SET @q = IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
   WHERE TABLE_SCHEMA=@db AND TABLE_NAME='client_transaction_requests' AND INDEX_NAME='idx_payment_status')=0,
  "ALTER TABLE client_transaction_requests ADD INDEX idx_payment_status(status, payment_proof_file(20))",
  'SELECT 1'
);
PREPARE s FROM @q; EXECUTE s; DEALLOCATE PREPARE s;

-- ============================================================
-- FIN MIGRATION v3.1
-- ============================================================
SELECT 'Migration v3.1 appliquée avec succès.' AS result;
