
{
  "rules": {
    "streams": {
      ".read": true,
      ".indexOn": ["creatorId", "status"],
      "$streamId": {
        ".write": "auth != null && (!data.exists() || data.child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')",
        ".validate": "newData.hasChildren(['name', 'sourceUrls', 'creatorId', 'status', 'views', 'createdAt'])",
        "name": {
          ".validate": "newData.isString() && newData.val().length > 0"
        },
        "sourceUrls": {
          ".validate": "newData.hasChildren() && newData.child('0').isString() && newData.child('0').val().length > 0"
        },
        "description": {
          ".validate": "newData.isString()"
        },
        "streamType": {
            ".validate": "newData.isString() && (newData.val() === 'video' || newData.val() === 'audio')"
        },
        "views": {
          ".write": true,
          ".validate": "newData.isNumber() && ((!data.exists() && newData.val() === 0) || (data.exists() && newData.val() === data.val() + 1) || (auth != null && root.child('users').child(auth.uid).child('role').val() === 'admin'))"
        },
        "creatorId": {
          ".validate": "newData.isString() && (newData.val() === auth.uid || !data.exists())"
        },
        "status": {
           ".validate": "newData.isString() && (newData.val() === 'pending' || newData.val() === 'approved' || newData.val() === 'pending_deletion' || newData.val() === 'deleted' || newData.val() === 'rejected' || newData.val() === 'disabled')"
        },
        "createdAt": {
          ".validate": "newData.val() === now || data.exists()"
        },
        "deletedAt": {
          ".validate": "(newData.val() === now && root.child('users').child(auth.uid).child('role').val() === 'admin') || !newData.exists()"
        },
        "pinIndex": {
           ".write": "auth != null && root.child('users').child(auth.uid).child('role').val() === 'admin'",
           ".validate": "(newData.isNumber() && newData.val() >= 1 && newData.val() <= 5) || newData.val() === null"
        },
        "audioPinIndex": {
           ".write": "auth != null && root.child('users').child(auth.uid).child('role').val() === 'admin'",
           ".validate": "(newData.isNumber() && newData.val() >= 1 && newData.val() <= 5) || newData.val() === null"
        },
        "likes": {
          ".write": "auth != null",
          "$uid": {
            ".write": "auth != null && auth.uid === $uid",
            ".validate": "newData.isBoolean() || !newData.exists()"
          }
        },
        "comments": {
          "$commentId": {
            ".write": "auth != null",
            ".validate": "newData.hasChildren(['id', 'userId', 'username', 'text', 'timestamp']) && newData.child('userId').val() === auth.uid",
            "id": { ".validate": "newData.isString() && newData.val() === $commentId" },
            "userId": { ".validate": "newData.isString() && newData.val() === auth.uid" },
            "username": { ".validate": "newData.isString()" },
            "text": { ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 500" },
            "timestamp": { ".validate": "newData.val() === now" },
            "$other": { ".validate": false }
          }
        },
        "associatedVideos": {
          ".write": "auth != null && (root.child('streams').child($streamId).child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')",
          "$videoId": {
            ".validate": "!newData.exists() || (newData.hasChildren(['id', 'title', 'youtubeUrl', 'addedAt']) && newData.child('id').val() === $videoId)",
            "id": { ".validate": "newData.isString()" },
            "title": { ".validate": "newData.isString() && newData.val().length > 0" },
            "description": { ".validate": "newData.isString()" },
            "youtubeUrl": { ".validate": "newData.isString() && newData.val().contains('youtube.com') || newData.val().contains('youtu.be')" },
            "addedAt": { ".validate": "newData.val() === now" },
            "$other": { ".validate": false }
          }
        },
        "playlists": {
          ".write": "auth != null && (root.child('streams').child($streamId).child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')",
          "$playlistId": {
            ".validate": "!newData.exists() || newData.hasChildren(['id', 'title', 'createdAt'])",
            "id": { ".validate": "newData.isString() && newData.val() === $playlistId" },
            "title": { ".validate": "newData.isString() && newData.val().length > 0" },
            "createdAt": { ".validate": "newData.val() === now || data.exists()" },
            "items": {
                "$playlistItemId": {
                  ".validate": "!newData.exists() || (newData.hasChildren(['id', 'title', 'youtubeUrl', 'addedAt']) && newData.child('id').val() === $playlistItemId)",
                  "id": { ".validate": "newData.isString()" },
                  "title": { ".validate": "newData.isString() && newData.val().length > 0" },
                  "youtubeUrl": { ".validate": "newData.isString() && (newData.val().contains('youtube.com') || newData.val().contains('youtu.be'))" },
                  "addedAt": { ".validate": "newData.val() === now || data.exists()" },
                  "$other": { ".validate": false }
                }
            },
            "$other": { ".validate": "newData.hasChild('items') || !newData.hasChildren()" }
          }
        },
        "$other": { ".validate": false }
      }
    },
    "view_logs": {
      ".read": true,
      ".indexOn": "timestamp",
      "$logId": {
        ".write": true,
        ".validate": "newData.hasChildren(['streamId', 'timestamp']) && newData.child('timestamp').val() === now"
      }
    },
    "videos": {
      ".read": true,
      ".indexOn": ["creatorId", "status"],
      "$videoId": {
        ".write": "auth != null && (!data.exists() || data.child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')",
        ".validate": "newData.hasChildren(['title', 'creatorId', 'status', 'submittedAt', 'duration', 'createdAt'])",
        "creatorId": { ".validate": "newData.isString() && (newData.val() === auth.uid || !data.exists())" },
        "status": {
          ".validate": "newData.val() === 'pending' || (root.child('users').child(auth.uid).child('role').val() === 'admin')"
        },
        "title": { ".validate": "newData.isString() && newData.val().length > 0" },
        "createdAt": { ".validate": "newData.val() === now || data.exists()" },
        "actionedAt": { ".validate": "newData.val() === now || !newData.exists()" },
        "description": { ".validate": "newData.isString()" },
        "fileName": { ".validate": "newData.isString()" },
        "fileType": { ".validate": "newData.isString()" },
        "duration": { ".validate": "newData.isNumber()" },
        "submittedAt": { ".validate": "newData.isString()" },
        "videoStorageUrl": { ".validate": "newData.isString()" },
        "associatedVideos": { ".validate": false },
        "$other": { ".validate": false }
      }
    },
    "users": {
      ".read": true,
      "$uid": {
        ".write": "auth != null && auth.uid === $uid"
      }
    }
  }
}
